亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > AJAX > 正文

如何不用組件實現Ajax效果

2024-09-01 08:26:23
字體:
來源:轉載
供稿:網友

現在.NET的Ajax組件確實不少了,微軟的ajax extensions用起來很方便,一個UpdatePanel就可以搞定一切。不過,可能有些朋友更愿意自己來寫。那么在.NET里,你是否知道ICallbackEventHandler呢?

大家應該都知道ASP.NET頁面調用時的幾種方式:Postback/Cross-page posting/Server transfer/Callback,如果你還不太了解,你可以看看MSDN:How t Determine How ASP.NET Web Pages Were Invoked

現在要說的,就是Callback這種調用方式。
簡單的說,使用Callback可以得到你平??吹侥敲碅jax效果,即不刷新整個頁面,只更新其中一個部分。

使用Callback,只需要做以下4步:

1、在你的頁面中繼承System.Web.UI.ICallbackEventHandler接口。

public partial class _Default : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
}
#region ICallbackEventHandler Members
public string GetCallbackResult()
{
}
public void RaiseCallbackEvent(string eventArgument)
{
}
#endregion
}

如果你沒有使用code-behind,那你也可以在aspx頁面頂部加入下面的代碼:

<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>

2、在前臺寫一段自定義的javascript,更新頁面

這一段javascript用來更新頁面的某個局部,就像你平常操作的一樣,寫些document.getElementById("xxx").innerHTML="working on your request...."。

<script type="text/javascript">
function GetFlag(arg)//這里已經得到服務器端數據據了,服務器端數據就在這個參數arg里。
{
document.getElementById("result").innerHTML=arg;//我們不作處理,直接顯示在頁面上。
}
</script>

你可能有些迷糊,就得到了嗎?連個什么XMLHttpRequest都沒有哩……

3、在Page_Load中再注冊一段javascript

string script = Page.ClientScript.GetCallbackEventReference(this, "arg", "GetFlag", "");
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), .......//省略了一大串

上面的GetCallbackEventReference是用來得到客戶端函數的引用,發起一個callback到服務器端的,你不必知道詳細內容。

你只需要了解:

  • 第一個參數填this,用來handle客戶端的callback的,它必須繼承ICallbackEventHandler接口并提供RaiseCallbackEvent方法,我們已經在繼承了這個接口,上面第一點中的代碼也有RaiseCallbackEvent方法,只是還沒有具體寫內容呢。
  • 第二個參數就是那個 從客戶端傳到服務器端的參數。如果你想要注冊的檢查用戶是否可用,那么這里的值就是用戶輸的那個值。
  • 第三個參數是前臺的javascript函數名,在第二步中我們寫的名字是:GetFlag。當數據好了,這個javascript函數就會用到。
  • 第四個參數一般用不上。

返回值:一個函數的名字,是客戶端調用的函數名。這個函數會調用到服務器端了。

4、調用你的函數。

<input type="button" value="check it!" onclick="callServer()" />

上面一定是 onclick="callServer()"嗎?呵呵,這要看你了,你在Page.ClientScript.RegisterClientScriptBlock注冊的什么javascript函數名字,就是什么名字了。(在第3步的第二行code中)

已經完了。如果你還是一頭霧水,沒關系,下面看一個實例

我們寫一個檢測用戶是否已經注冊的小程序,這在每個用戶注冊頁面上都可以用到。

前臺Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" EnableViewState="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>ICallbackEventHandler Demo</title>
<style type="text/css">
*{font: 12px "verdana";}
#user{border:1px solid #080; height:50px;width:500px;padding:20px;}
input{border:1px solid #508FCC;background:#FFF;}
.ok{color:#090;}
.bad{color:#F00}
#result{display:inline;margin: 0 5px 0;}
</style>
<script type="text/javascript">
function GetFlag(arg)//這里的javascript函數就是服務器查詢完成要調用的函數,我們把服務器返回的數據直接顯示上ID為result的div中。
{
document.getElementById("result").innerHTML=arg;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div id="user">
<input type="text" value="99love" maxlength="10" id="userid" />
<input type="button" value="check it!" onclick="callServer()" /><div id="result">查詢用戶是否被使用。</div>
</div>
</form>
</body>
</html>

上面有一個<input type="button" value="check it!" onclick="callServer()" />,這是我說的第5步的內容,這個函數名字callServer應該和Lage_Load中注冊的相對應的。

后臺Default.aspx.cs:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
private string _arg = string.Empty;
protected void Page_Load(object sender, EventArgs e)
{
string script = Page.ClientScript.GetCallbackEventReference(this, "arg", "GetFlag", "");//上面的第3步,取得這個客戶端函數名,script的值可能是這樣的:WebForm_DoCallback('__Page',arg,GetFlag,/"/",null,false)
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "callServer", "/nfunction callServer(){/ndocument.getElementById(/"result/").innerHTML=/"正在檢查 /"+document.getElementById(/"userid/").value+/" 的可用性,請稍候.../";/nvar arg=document.getElementById(/"userid/").value;/n" + script + ";/n}", true);
//上面這一行有點長了,第二個參數最長,看到function callServer()了嗎,這就是和前臺對應的那個函數名<input onclick=XXX,請記得,一定要在callServer函數中加入script的值,也就是上一行的上一行(17行)那個值。注意后面的var arg=...,這個arg和17行的arg是對應的。
}
#region ICallbackEventHandler Members
public string GetCallbackResult()
{
System.Threading.Thread.Sleep(1000);//讓線程睡一會,我們好看效果。這是用來模擬不良網絡狀況的。
return _arg;//返回一個string型,這個string在RaiseCallbackEvent函數中是賦過值的,看下面哦。
}
public void RaiseCallbackEvent(string eventArgument)
{
if (eventArgument.Equals("99love") || eventArgument.Equals("blueidea"))//假設這兩個名字不能注冊,實際操作中,你要是比對數據庫記錄的,我們現在簡化處理了。
_arg = string.Format("<span class=/"bad/">很遺憾,{0} 已被使用。</span>", eventArgument);//要么已經注冊了
else
_arg = string.Format("<span class=/"ok/">恭喜您,{0} 可以注冊。</span>", eventArgument);//要么就可以注冊
}
#endregion
}

運行截圖:

UI設計

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品女av网站| 欧美一级在线播放| 日韩精品极品视频| 成人欧美一区二区三区在线湿哒哒| 欧美成人亚洲成人| 欧美超级免费视 在线| 日韩精品中文字幕在线播放| 亚洲成人xxx| 亚洲一区二区三区sesese| 久久久久99精品久久久久| 欧美性xxxxxxxxx| 欧美一级成年大片在线观看| 色婷婷av一区二区三区在线观看| 中文字幕av一区中文字幕天堂| 爽爽爽爽爽爽爽成人免费观看| 欧美老女人在线视频| 欧美日本中文字幕| 福利视频一区二区| 欧美日韩ab片| 亚洲美腿欧美激情另类| 亚洲精品国产拍免费91在线| 国产精品一区二区久久久| 亚洲午夜激情免费视频| 日韩欧美综合在线视频| 中文字幕日韩av电影| 成人亚洲激情网| 北条麻妃一区二区在线观看| 亚洲区免费影片| 欧美激情综合亚洲一二区| 亚洲精品日韩丝袜精品| 日韩资源在线观看| 成人精品视频99在线观看免费| 久久91精品国产| 日韩精品在线播放| 国产97在线|日韩| 国语自产在线不卡| 欧美激情影音先锋| 日韩中文字幕第一页| 久久亚洲精品网站| 欧美在线观看一区二区三区| 亚洲精品国产精品乱码不99按摩| 在线观看日韩www视频免费| 欧美精品激情视频| 色综合久综合久久综合久鬼88| 日韩精品免费电影| 日韩精品一区二区视频| 亚洲欧美日韩精品| 日韩视频中文字幕| 最近中文字幕mv在线一区二区三区四区| 欧美肥老太性生活视频| 色偷偷888欧美精品久久久| 欧美日韩激情小视频| 国产精品男人的天堂| 午夜精品久久久久久久男人的天堂| 亚洲一区二区国产| 日韩成人在线视频观看| 国产性色av一区二区| 欧美一级电影在线| 精品视频偷偷看在线观看| 97**国产露脸精品国产| 在线播放亚洲激情| 清纯唯美亚洲激情| 亚洲第一天堂无码专区| 午夜精品视频网站| 国产精品一区二区性色av| 欧美亚洲激情在线| 亚洲色图色老头| 精品国内产的精品视频在线观看| 国产精品成av人在线视午夜片| 一本久久综合亚洲鲁鲁| 国产亚洲欧美日韩精品| 狠狠做深爱婷婷久久综合一区| 成人精品在线观看| 日韩福利在线播放| 国产99久久久欧美黑人| 中文字幕欧美视频在线| 久久久久久国产| 日韩精品在线第一页| 欧美日韩国产一区在线| 日韩成人在线网站| 91地址最新发布| 日韩av日韩在线观看| 性欧美办公室18xxxxhd| 亚洲精品日产aⅴ| 国产精品99久久久久久久久久久久| 欧美激情视频播放| 成人激情综合网| 欧美最猛性xxxxx(亚洲精品)| 国产精品看片资源| 成人激情在线观看| 久久免费精品日本久久中文字幕| 亚洲精品网址在线观看| 最近2019好看的中文字幕免费| 亚洲成人久久久久| 欧美日韩免费在线| 成人免费观看49www在线观看| 亚洲精品久久久久久久久久久久| 亚洲伊人一本大道中文字幕| 乱亲女秽乱长久久久| 欧美猛男性生活免费| 亚洲日韩中文字幕| 精品国产乱码久久久久久婷婷| 久久久久999| 日韩av一区在线观看| 欧美国产日韩一区二区三区| 91精品久久久久久综合乱菊| 亲爱的老师9免费观看全集电视剧| 国产精品99久久久久久久久久久久| 国产精品爱久久久久久久| 韩国视频理论视频久久| 久久精品这里热有精品| 精品亚洲一区二区三区四区五区| 最近2019好看的中文字幕免费| 色天天综合狠狠色| 中文精品99久久国产香蕉| 国产有码在线一区二区视频| 国产做受69高潮| 亚洲男人的天堂在线播放| 日韩欧美在线观看| 国产精品高精视频免费| 欧美日韩激情视频| 国产精品igao视频| 久久网福利资源网站| 欧美日韩在线免费观看| 欧美风情在线观看| 亚洲免费视频观看| 91高清免费在线观看| 一区二区三区在线播放欧美| 狠狠躁天天躁日日躁欧美| 2019亚洲日韩新视频| 成人欧美一区二区三区黑人| 在线视频免费一区二区| 亚洲精品国产精品久久清纯直播| 日韩在线一区二区三区免费视频| 97香蕉超级碰碰久久免费的优势| 国产中文欧美精品| 国产精品久久久久久久av电影| 久久亚洲精品视频| 中文字幕在线看视频国产欧美在线看完整| 黑人极品videos精品欧美裸| 国产精品成人国产乱一区| 精品五月天久久| 欧美国产视频日韩| 国产高清视频一区三区| **欧美日韩vr在线| 欧美不卡视频一区发布| 亚洲区中文字幕| 中文字幕一区二区三区电影| 91亚洲精品一区| 精品偷拍各种wc美女嘘嘘| www.日韩不卡电影av| 88国产精品欧美一区二区三区| 欧美精品xxx| 亚洲性无码av在线| 亚洲精品xxx| 日韩一区二区三区在线播放| 国产成人午夜视频网址| 国产精品一区二区女厕厕| 欧美性感美女h网站在线观看免费| 久久久久久69| 欧美wwwxxxx| 国产精品第一区| 亚洲精品中文字幕女同| 亚洲www永久成人夜色|