Asp.Net/C#/WCF - ASP.NET ICallbackEventHandler接口

ASP.NET 2.0 Callback 使得ASP.NET Server端控件可以調用服務端的方法而不須要執行一個完整的Postback過程,也就是說使得Server端控件能夠很好的支持Ajax
xcode

  Callback不一樣於Postback之處在於向服務器發送請求時只有ViewState和用戶自定義信息被髮送到服務器端,請求完畢後,只返回用戶自定義結果,而不會從Render頁面。服務器

  GridView控件正是使用了這個技術來實現無刷新的分頁及排序功能,那麼它是如何實現的哪,咱們又如何在自定義控件中添加該功能哪?本文將會簡單地闡述如何使用ASP.NET 2.0 Callback來實現Ajax.異步

1 ICallbackEventHandler 接口ide

  ASP.NET Server端控件能夠經過實現ICallbackEventHandler 接口來接受客戶端Callback事件。
  ICallbackEventHandler 接口聲明:函數

-收縮 C#代碼
public  interface ICallbackEventHandler
{
    string GetCallbackResult();
    void RaiseCallbackEvent( string eventArgument);
}

  RaiseCallbackEvent負責處理客戶端回調事件,其中方法參數eventArgument是客戶端腳本在觸發Callback時提供的,該方法將會依賴於eventArgument參數來進行處理。
GetCallbackResult則負責將處理結果做爲String返回給客戶端腳本。當Callback完成後客戶端腳本將會根據獲得的處理結果,進行頁面局部更新。this

2 CallbackEventReferencespa

  那麼怎麼樣才能註冊一段客戶端腳原本觸發Callback,還須要作些什麼哪?code

  ClientScriptManager類用於管理Web頁面中的客戶端腳本,提供了一系列的方法來註冊腳本,而且還能夠得到指定客戶端腳本函數的引 用。 經過ClientScriptManager類的GetCallbackEventReference方法咱們能夠獲取一個對客戶端函數的引用。當該函數 在客戶端被調用時,將啓動一次客戶端回調。

GetCallbackEventReference方法聲明:orm

-收縮 C#代碼
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應該被同步執行仍是異步執行。server

  獲取這個Callback客戶端函數的引用以後,咱們能夠註冊一個新的客戶端函數來調用它。而後再客戶端就能夠經過新註冊的函數來進行Callback了。

3.示例

  咱們經過一個簡單的例子來剖析ASP.NET 2.0 Callback的整個執行過程:

-收縮 C#代碼
public  class MyControl : WebControl, ICallbackEventHandler
     {
          private  const  string Script1 =  "function onCallbackComplete(result){ \n" +
                  "   var element = document.getElementById('%ID%'); \n" +
                  "   if(element != null) \n" +
                  "       element.innerHTML = result;} \n";
 
          private  const  string Script2 =  "function onCallbackError(){ \n" +
                  "   var element = document.getElementById('%ID%'); \n" +
                 "   if(element != null) \n" +
                 "       element.innerHTML = 'error';} \n";

         public  string GetCallbackResult()
        {
             return  "Callback result";
        }

         public  void RaiseCallbackEvent( string eventArgument)
        {
        }

         public  override  void RenderBeginTag(HtmlTextWriter writer)
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick,  "DoClientCallBack()");
             base.RenderBeginTag(writer);
            writer.Write( "My Callback control");
        }

         protected  override  void OnPreRender(EventArgs e)
        {
             //Define callback references.
             string callbackRef =  this.Page.ClientScript.GetCallbackEventReference(
                 this"""onCallbackComplete"null"onCallbackError", true);

             // Register script blocks will perform call to the server.
             this.Page.ClientScript.RegisterClientScriptBlock(
                 this.GetType(),  "DoClientCallBack",
                 "function DoClientCallBack() { " + callbackRef +  "} \n", true
            );

             // Register other scripts
             this.Page.ClientScript.RegisterClientScriptBlock(
                 this.GetType(),  "onCallbackComplete"
                Script1.Replace( "%ID%"this.ClientID), true);
             this.Page.ClientScript.RegisterClientScriptBlock(
                 this.GetType(),  "onCallbackError"
                Script2.Replace( "%ID%"this.ClientID), true); 

             base.OnPreRender(e);
        }

  將上面的寫好的控件放到一個Page上,在Runtime 當點擊該控件的時候便會執行一次Callback,而且更新控件內容。

  執行順序:

  其中WebForm_DoCallback和WebForm_CallbackComplete是微軟JavaScript庫中的方法。

  ASP.NET 2.0 Callback提供了一種簡單的方法來使得ASP.NET Server段控件能夠支持AJAX,其自己能夠看做是一種輕量級的Postback。

全文完。

相關文章
相關標籤/搜索