本文參考《ASP.NET2.0經典案例教程》的部分內容。
雖然現在各種各樣的Ajax已近流行很久,但本文還是回顧一下ASP.NET2.0的Ajax技術 - 回調,就當是個懷舊。回調的作用類似於ASP.NET Ajax,其使瀏覽器能夠非同步呼叫遠程伺服器,而無需重新整理頁面。
回調實現的方法及執行的過程如下:
1. 讓頁面實現ICallbackEventHandler介面,實現該介面的WebForm將自動添加用戶端JavaScript函數。GetCallbackEventReference方法擷取上文提到的用戶端JavaScript函數的名稱。該函數即是回調的發起者。
2. 在用戶端註冊的JavaScript中包含了一個回調管理器。其負責在瀏覽器與伺服器之間發起或響應XmlHttp通訊。頁面中以回調方式發送給伺服器的請求將被回調管理器攔截,並以符合Xml Http的方式將這個請求發送到伺服器。
3. 回調管理器將請求發送到伺服器後,伺服器調用ICallbackEventHandler.RaiseCallbackEvent()來處理。開發人員將處理請求的邏輯放置在這個函數中,處理調用並返迴響應,響應的傳回值可以為字串。
4. 響應被返回給回調管理器,回調管理器通知調用者回調已完成,並將響應字串交給最初的調用者。
下面將給出一段樣本性代碼來展示這個過程。
1. 首先建立一個WebForm名為CallBack.aspx,並讓這個CallBack類實現ICallbackEventHandler介面。
public partial class Callback : System.Web.UI.Page,ICallbackEventHandler
2. 在VS中使用重構工具顯示實現這個介面,會產生如下兩個方法。
#region ICallbackEventHandler 成員
string ICallbackEventHandler.GetCallbackResult()
{
throw new NotImplementedException();
}
void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
{
throw new NotImplementedException();
}
#endregion
其中RaiseCallbackEvent()接受來自用戶端的調用,讓伺服器能夠處理所需的商務邏輯,GetCallbackResult()函數將響應返回給用戶端,讓用戶端能夠通過JavaScript在瀏覽器中顯示更新。
3. 這一步提供用戶端指令碼,函數名分別為CallServer和ReceiveServerData的函數提供了回調管理器指令碼的入口和出口。
protected void Page_Load(object sender, EventArgs e)
{
ClientScriptManager cm = Page.ClientScript;
string cbReference;
cbReference = cm.GetCallbackEventReference(this, "arg", "ReceiveServerData", "");
string callbackScript = "";
callbackScript += "function CallServer(arg, context){" + cbReference + ";}";
cm.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);
}
4. 在Form中添加一個文字框的表單元素,將其命名為txtMessage。其用來取得使用者要提交給伺服器的資料。
<input id="txtMessage" type="text" style="width: 218px; height: 55px" />
5. 接下來添加一個按鈕,按鈕的onclick事件處理中調用回調管理器的入口(即第3步中的CallServer函數)。
<input id="Button1" type="button" value="Send"
onclick="CallServer(document.getElementById('textMessage').value,null)"
style="width:57px;height:60px" />
onclick接受txtMessage控制項的text值作為參數。
6. 在表單中添加名為ReceiveServerData()的JavaScript函數。該函數接受參數arg和context。Arg提供伺服器處理完調用後返回的響應。在這其中可以編寫任意的Js代碼來更新html。
<script type="text/javascript">
function ReceiveServerData(arg, context) {
var obj = document.getElementById("result");
obj.innerHTML += arg;
}
</script>
最後附上這個分頁檔供參考。