原創文章,如需轉載,請注明出處.
ASP.NET 2.0 Callback 使得ASP.NET Server端控件能夠調用服務端的方法而不需要執行一個完整的Postback過程,也就是說使得Server端控件可以很好的支持Ajax。
Callback不同于Postback之處在于向服務器發送請求時只有ViewState和用戶自定義信息被發送到服務器端,請求完畢后,只返回用戶自定義結果,而不會從Render頁面。
GridView控件正是使用了這個技術來實現無刷新的分頁及排序功能,那么它是如何實現的哪,我們又如何在自定義控件中添加該功能哪?本文將會簡單地闡述如何使用ASP.NET 2.0 Callback來實現Ajax.
1. ICallbackEventHandler 接口
ASP.NET Server端控件可以通過實現ICallbackEventHandler 接口來接受客戶端Callback事件。
ICallbackEventHandler 接口聲明:
2{
3 string GetCallbackResult();
4 void RaiseCallbackEvent(string eventArgument);
5}
RaiseCallbackEvent負責處理客戶端回調事件,其中方法參數eventArgument是客戶端腳本在觸發Callback時提供的,該方法將會依賴于eventArgument參數來進行處理。
GetCallbackResult則負責將處理結果作為String返回給客戶端腳本。當Callback完成后客戶端腳本將會根據得到的處理結果,進行頁面局部更新。
2. CallbackEventReference
那么怎么樣才能注冊一段客戶端腳本來觸發Callback,還需要做些什么哪?
ClientScriptManager類用于管理Web頁面中的客戶端腳本,提供了一系列的方法來注冊腳本,并且還可以獲得指定客戶端腳本函數的引用。
通過ClientScriptManager類的GetCallbackEventReference方法我們可以獲取一個對客戶端函數的引用。當該函數在客戶端被調用時,將啟動一次客戶端回調。
GetCallbackEventReference方法聲明:
Control control,
string argument,
string clientCallback,
string context,
string clientErrorCallback,
bool useAsync
)
第一個參數指的是實現ICallbackEventHandler
接口的服務器端控件;
第二個參數將被傳遞給在服務器端執行的RaiseCallbackEvent方法,它可以是一個JavaScript函數調用表達式;
第三個參數是一個JavaScript函數名,在Callback完成后,該函數將被調用,同時服務器端函數GetCallbackResult的執行結果也將作為這一個函數的參數;
第四個參數是當前執行的Callback的上下文,這個參數也可以是一個JavaScript函數調用表達式;
第五個參數是一個JavaScript函數名,在Callback執行的過程中如果有錯誤產生,該函數將被調用。
第六個參數是一個Bool值來確定當前Callback應該被同步執行還是異步執行。
獲取這個Callback客戶端函數的引用之后,我們可以注冊一個新的客戶端函數來調用它。然后再客戶端就可以通過新注冊的函數來進行Callback了。
3.示例
我們通過一個簡單的例子來剖析ASP.NET 2.0 Callback的整個執行過程:
2 {
3 private const string Script1 = "function onCallbackComplete(result){ \n" +
4 " var element = document.getElementById('%ID%'); \n" +
5 " if(element != null) \n" +
6 " element.innerHTML = result;} \n";
7
8 private const string Script2 = "function onCallbackError(){ \n" +
9 " var element = document.getElementById('%ID%'); \n" +
10 " if(element != null) \n" +
11 " element.innerHTML = 'error';} \n";
12
13 public string GetCallbackResult()
14 {
15 return "Callback result";
16 }
17
18 public void RaiseCallbackEvent(string eventArgument)
19 {
20 }
21
22 public override void RenderBeginTag(HtmlTextWriter writer)
23 {
24 writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "DoClientCallBack()");
25 base.RenderBeginTag(writer);
26 writer.Write("My Callback control");
27 }
28
29 protected override void OnPreRender(EventArgs e)
30 {
31 //Define callback references.
32 string callbackRef = this.Page.ClientScript.GetCallbackEventReference(
33 this, "", "onCallbackComplete", null, "onCallbackError", true);
34
35 // Register script blocks will perform call to the server.
36 this.Page.ClientScript.RegisterClientScriptBlock(
37 this.GetType(), "DoClientCallBack",
38 "function DoClientCallBack() { " + callbackRef + "} \n", true
39 );
40
41 // Register other scripts
42 this.Page.ClientScript.RegisterClientScriptBlock(
43 this.GetType(), "onCallbackComplete",
44 Script1.Replace("%ID%", this.ClientID), true);
45 this.Page.ClientScript.RegisterClientScriptBlock(
46 this.GetType(), "onCallbackError",
47 Script2.Replace("%ID%", this.ClientID), true);
48
49 base.OnPreRender(e);
50 }
將上面的寫好的控件放到一個Page上,在Runtime 當點擊該控件的時候便會執行一次Callback,并且更新控件內容。
執行順序:
其中WebForm_DoCallback和WebForm_CallbackComplete是微軟JavaScript庫中的方法。
ASP.NET 2.0 Callback提供了一種簡單的方法來使得ASP.NET Server段控件可以支持AJAX,其本身可以看作是一種輕量級的Postback。
全文完。
[更新 2008.05.27]
關于構建XMLHttpRequest時,設置useAsync參數為True和False的區別,我摘錄了MSDN的解釋:
bAsync
Optional.
Variant that specifies
true for asynchronous operation (the call returns immediately), or
false for synchronous operation.
If true, assign a callback handler to
the onreadystatechange property
to determine when the call has completed.
If not specified, the default is true.
注意黑體字部分,另外還有一點區別就是,當這次請求是同步的時候,是沒有辦法Cancel的。也就是說只有在bAsync為True的時候,XmlHttpRequest對象的Abort方法才會生效。
不含病毒。www.avast.com |
留言列表