文章出處

原創文章,如需轉載,請注明出處.

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 接口聲明:

1public interface 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方法聲明:

public string 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的整個執行過程:

 1public class MyControl : WebControl, ICallbackEventHandler
 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.

When bAsync is set to false, send operations are synchronous, and Windows Internet Explorer does not accept input or produce output while send operations are in progress. Therefore, this setting should not be used in situations where it is possible for a user to be waiting on the send operation to complete.

注意黑體字部分,另外還有一點區別就是,當這次請求是同步的時候,是沒有辦法Cancel的。也就是說只有在bAsync為True的時候,XmlHttpRequest對象的Abort方法才會生效。

不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()