在 Anthem.Net 中,通過 XmlHttp 或 XMLHttpRequest 組件對服務器端所作的一次無刷新調用(通常是異步模式),稱為一個回調(Callback)。
本文內容是對 Anthem.NET 框架自帶范例代碼的整理和歸納,著重小結一下在使用 Anthem.Net 進行 AJax 開發的時候所涉及的調用流程控制相關的內容。至於控件的使用,因為邏輯簡單,這裡不做敘述。
在本文後,計劃寫一篇文章對調用流程及其編程時的可控制點做比較完備的歸納。
一、普通的調用<%@ Register TagPrefix="anthem" Namespace="Anthem" Assembly="Anthem" %>
二、在回調前後添加自定義客戶端函數的執行邏輯
幾個常用的屬性:
PreCallBackFunction:用於定義回調前執行的函數,通常可以在這裡加入確認的判斷。
在這個函數裡 return false 將會取消回調。
PostCallBackFunction: 回調後執行的函數。
TextDuringCallBack: 用於定義回調過程中控件顯示的提示信息(通常是提示等待的文字)
EnabledDuringCallBack: 在回調過程中,控件是否禁用。
CallBackCancelledFunction: 如果回調被取消,則會調用這個函數。
代碼例子:
注意以上這些客戶端處理函數中,都可以傳遞 control 本身作為參數,因此在必要的情況下這些函數是可以被重用的。(比如對一組類似的控件的回發事件進行處理)
三、調用服務器頁面的方法
服務器端需要做的事情:[Anthem.Method]
public int Add(int a, int b) {
return a + b;
}void Page_Load() {
Anthem.Manager.Register(this);
}
客戶端:
// 參數的含義依次是:
// 服務器方法的名字,
// 方法的參數(以 JS 數組形式傳遞),
// 服務器端方法返回結果時調用的回調函數(因為是異步模式)。Anthem_InvokePageMethod(
'Add',
[document.getElementById('a').value, document.getElementById('b').value],
function(result) {
document.getElementById('c').value = result.value;
}
);
調用後,在回調函數的參數中得到的 result 變量,是一個包含 value 和 error 兩個屬性的對象。如果在服務器端發生錯誤,則 value 為 null, 而 error 中包含錯誤數據。
四、如何處理回調時可能發生的異常
在頁面中定義 Anthem_Error JS 函數,則可處理所有回調時的未處理異常。
異常也可以在服務器端處理。只要定義下列名稱的方法:
void Page_Error()
{
Anthem.Manager.AddScriptForClIEntSideEval("window.location = '>http://anthem-dot-net.sf.Net/'");
}
在服務器端處理有一些額外的好處,主要是可以將異常信息記錄到日志.
五、頁面跳轉
在 Callback 的處理中,不能用 Response.Redirect 來處理頁面跳轉,因為這些函數是通過 js 的無刷新來調用的。代替的辦法是用 Anthem.Manager 回傳一段 JS 給客戶端去用 eval 的方式執行,從而達到頁面跳轉的效果(推而廣之,這個 eval 的功能當然不限於跳轉頁面,可以干很多其他的事情)。
代碼示例:
Anthem.Manager.AddScriptForClIEntSideEval("window.location = 'http://anthem-dot-net.sourceforge.Net/';");
六、幾個全局級別的客戶端回調函數
我們可以在客戶端定義幾個特殊名字的函數,以供 Anthem 在每一次回調的前後調用。這些函數包括:
Anthem_PreCallBack(),
Anthem_CallBackCancelled(),
Anthem_PostCallBack(),
除此之外還包括前面說到的 Anthem_Error() 等。
這裡典型的一個應用場景是,在每次回調開始後,我們在 Anthem_PreCallBack() 中創建一個“loading”信息的層,然後在取消(Anthem_CallBackCancelled) 或成功回調後(Anthem_PostCallBack),移除這個層。
這樣可以很方便的模擬出類似 Gmail 中的加載效果。
七、回調過程中向頁面添加了新的 JS 腳本
這種情況下必須設定一個額外的屬性:
Anthem.Manager.IncludePageScripts = true;
例子:
八、PreUpdate 事件
控件在 Render 之前,如果 UpdateAfterCallBack 為 true,則會引發這個事件。
目前這個事件的用途似乎不大。