在ASP.NET開發過程中我們會遇到這類情況:為了擷取伺服器端狀態而在提交整個頁面,造成了很大的浪費。我們知道現在流行的AJAX架構能夠實現局部頁面更新,避免整個頁面重新整理。其實ASP.NET也提供了類似的解決方案。
在 ASP.NET 網頁的預設模型中,使用者會與頁互動,單擊按鈕或執行導致回傳的一些其他動作。此時將重新建立頁及其控制項,並在伺服器上運行頁代碼,且新版本的頁被呈現到瀏覽器。但是,在有些情況下,需要從用戶端運行伺服器代碼,而不執行回傳。如果頁中的用戶端指令碼維護一些狀態資訊(例如,局部變數值),那麼發送頁和擷取頁的新副本就會損壞該狀態。此外,頁回傳會導致處理開銷,這會降低效能,且會讓使用者不得不等待處理並重新建立頁。
若要避免丟失用戶端狀態並且不導致伺服器往返的處理開銷,可以對 ASP.NET 網頁編碼,使其能執行用戶端回調。在用戶端回調中,用戶端指令碼函數會向 ASP.NET 網頁發送一個請求。該網頁運行其正常生命週期的修改版本 — 初始化頁並建立其控制項和其他成員,然後調用特別標記的方法。該方法執行代碼中編寫的處理過程,然後向瀏覽器返回可由另一用戶端指令碼函數讀取的值。在此過程中,該頁一直駐留在瀏覽器中。
下面給出的是一個簡單的例子:
點擊button控制項,在文字框內顯示伺服器端時間。如所示:
相關頁面代碼如下:
1<div>
2 <input type="text" id="txtTime" runat="server" readonly="readonly" />
3 <input type="button" id="btnGetTime" value="Get" runat="server" />
4 </div>
建立實現用戶端回調的 ASP.NET 頁與建立任何 ASP.NET 頁類似,但也有如下這些區別。頁的伺服器代碼必須實現ICallbackEventHandler介面。該介面需要RaiseCallbackEvent方法和GetCallbackResult方法。
1. RaiseCallbackEvent方法處理該事件
2. GetCallbackResult方法返回回調的結果
具體代碼如下:
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 txtTime.Value = DateTime.Now.ToString();
4
5 string callBackRef = ClientScript.GetCallbackEventReference(this, string.Empty, "getTime", string.Empty);
6 btnGetTime.Attributes["onclick"] = callBackRef;
7 }
8
9 public string GetCallbackResult()
10 {
11 return DateTime.Now.ToString();
12 }
13
14 public void RaiseCallbackEvent(string eventArgument)
15 {
16 //
17 }
另外,我們還需要實現用戶端回調javascript函數代碼,用來處理響應結果,實現局部頁面更新。代碼如下:
1 function getTime() {
2 document.getElementById("txtTime").value = arguments[0];
3 }
4