AJAX技術所提倡的無刷新回調,在原來的技術中需要寫大量的JavaScript程式碼或使用一些AJAX框架,使得開發效率和可維護性大大降低。其實ASP.NET2.0中,已經提供了這樣的接口,這就是ICallbackEventHandler。
關於ICallbackEventHandler網路上已經有很多文章介紹了,這篇實為畫蛇添足。
ICallbackEventHandler存在於System.Web.UI中,我們先做一個非常簡單的例子來試試看。
第一步,在VS2005中建立一個新的WEB窗件。
第二步,在ASPX中,放上一段HTML程式碼(如下):
1<body>
2 <form id="form1" runat="server">
3 <div>
4 <button onclick="CallServer()">CallServer</button>
5 </div>
6 </form>
7</body>
第三步,然後在<HEAD></HEAD>中放入一段JavaScript腳本:
1 <script type="text/javascript">
2 function CallServer()
3 {
4 var product = "測試";
5 <%= ClientScript.GetCallbackEventReference(this, "product", "ReceiveServerData",null)%>;
6 }
7
8 function ReceiveServerData(rValue)
9 {
10 alert(rValue);
11 }
12 </script>
第四步,在此ASPX的後台CS程式碼中,繼承ICallbackEventHandler接口,並實作介面中的兩個方法:
ICallbackEventHandler.GetCallbackResult()
和
ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
第五步,增加一個變數CallBackValue,修改介面的兩個方法為:
1 private string CallBackValue = string.Empty;
2
3 string ICallbackEventHandler.GetCallbackResult()
4 {
5 return CallBackValue + ",ok";
6 }
7
8 void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
9 {
10 this.CallBackValue = eventArgument;
11 }
12
第六步,執行,介面上會出現一個按鈕,點擊後,會將「測試」這個字串傳至後台,後台C#程式碼將字串加上「,OK」後傳回給客戶端的JavaScript程式碼,並顯示。
以上六步,就可以實現無刷新回調了。現在,我們來分析一下幾段程式碼。
先看第三步驟中的JavaScript程式碼,其中的CallServer()方法中進行了回調,回呼的語句為:
<%= ClientScript.GetCallbackEventReference(this, "product", "ReceiveServerData",null)%>;
裡面四個參數中第二個參數指定將product這個JavaScript中的字串變數傳回後台,第三個參數指定了從後台返回時接收回傳訊息的JavaScript方法ReceiveServerData(string Value)。
第五步驟中後台的兩個方法,一個ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)用來接收前台JavaScript中傳來的字串變量,並賦值給內部變數this.CallBackValue,另一個方法ICallbackEventHandler.GetCallbackResult()將變更後的內部變數this.CallBackValue回傳至前台JavaScript方法ReceiveServerData(string Value)。
呼叫的順序是: (前台)CallServer() --> (後台)ICallbackEventHandler.RaiseCallbackEvent(string eventArgument) --> (後台)ICallbackEventHandler.GetCallbackResult() --> (前台)ReceiveServerData(string Value)。
整個呼叫過程非常簡單,而其中非常關鍵的一步是第三步的
<%= ClientScript.GetCallbackEventReference(this, "product", "ReceiveServerData",null)%>;
這個方法,以下是從網路上找來的一段資料,大家可以看看。
GetCallbackEventReference使得客戶端方法在客戶端請求結束時得到回收。 它也讓CallBackManager 決定產生哪種回叫方法。 在這個範例內所使用的被重載的方法是:
public string GetCallbackEventReference(
string target, string argument,
string clientCallback, string context,
string clientErrorCallback)
Table 1. GetCallBackEventReference 方法的參數描述。
Parameters Description target ID of the page where the callback invocation is handled. For more see the other overloaded options available in the next immediate section.In our sample "this" is the argument value, since the lepment left. This is the parameter defintion used to send value to the server. This value is received by parameter "eventArgument" at the server end using the RaiseCallbackEvent event."arg" becomes the first from the client. clientCallback Method name of the callback that is invoked after successful server call."CallBackHandler" is the method name that handles the callback. context A parameter that is associated with the "cliused the shuled the parameter or thes associated with the " ally to identify the context of the call. You will understand this better from the sample implementation.In the sample "ctx" is just another parameter definition used. The value for this is passed from the client. clientErrorCallback Name of the method that is called from the CallBackManager in case of any errors.
從這個方法回傳的string是:
__doCallback('__Page',arg,CallBackHandler,ctx, ErrorCallBack)
另一個重載方法是:
public string GetCallbackEventReference(
Control control, string argument,
string clientCallback, string context)
public string GetCallbackEventReference(
Control control, string argument,
string clientCallback, string context,
string clientErrorCallback)