ajax|開發指南
private void Page_Load(object sender, EventArgs e){ Utility.RegisterTypeForAjax(typeof(User)); } |
在用戶端我們可以通過這樣的方式調用GetUser函數:
<script language="javascript"> function getUser(userId){ User.GetUser(GetUser_callback); }
function GetUser_callback(response){ if (response != null && response.value != null){ var user = response.value; if (typeof(user) == "object"){ alert(user.FirstName + " " + user.LastName); } } } getUser(1); </script> |
傳回值同伺服器端對象一樣有三個屬性(FirstName, LastName and UserId)。
譯者註:其他的類型只能由開發人員通過在伺服器端函數在傳回值時自訂轉換為ajax支援的類型來實現了,ajax推薦使用ToString方法。
其他工作方式
在其他類註冊函數
在上面的例子及描述中,我們都是通過在頁面的codebehind檔案裡完成函數的註冊,但並不是說只能在頁面的codebehide檔案裡完成註冊,我們也可以在其他類中註冊函數。回憶一下,Ajax封裝類是通過在特定類裡面尋找那些有Ajax.AjaxMethod()屬性的方法來完成工作的,這些類在用戶端又通過兩個script片斷來完成傳回值描述。使用Ajax.Utility.RegisterTypeForAjax,我們可以得到任何我們想得到類的詳細內容。例如,下面的例子可以說明我們在其他類中使用伺服器端函數是合法的:
Public Class AjaxFunctions <Ajax.AjaxMethod()> _ Public Function Validate(username As String, password As String) As Boolean 'do something 'Return something End Function End Class |
不過我們需要首先在調用頁面註冊這個代理類,類的名字不再是頁面類,而是我們使用的這個類:
'Vb.Net
Private Sub Page_Load(sender As Object, e As EventArgs) Handles MyBase.Load Ajax.Utility.RegisterTypeForAjax(GetType(AjaxFunctions)) '... End Sub |
//C#
private void Page_Load(object sender, EventArgs e){ Ajax.Utility.RegisterTypeForAjax(typeof(AjaxFunctions)); //... } |
記住,用戶端調用使用這種格式的名字<ClassName>.<ServerSideFunctionName>。因此,如果上面的Serversideadd函數位於AjaxFunctions類,而不是頁面類的話,用戶端調用則變為:AjaxFunctions.ServerSideAdd(1,2)
代理是怎樣工作的呢?
第二個script標籤,如下面的樣本
<script type="text/javascript" src="/cqyd/ajax/cqyd.SchemeSendWatch,cqyd.ashx"></script>
是由Ajax utility通過命名空間、類以及頁面程式集自動產生的(當然也可以人工加入),從這一點我們可以想到Ajax.PageHandlerFactory是通過反射來取得有定製屬性的函數的細節。很顯然,Handler尋找帶有AjaxMethod定製屬性的函數,取得他們的特徵(傳回型別、名稱、參數)並依據這些資訊建立用戶端代理。特別的,ajax建立一個與類型相同的JavaScript對象作為代理。
返回
Unicode
字元
Ajax.net可以從伺服器端向用戶端返回Unicode字元,為了做到這一點,在服務端函數返回時返回的值必須是Html編碼的:
- Ajax: 一個建立Web應用的新途徑
- Ajax的錯誤處理機制探討(2)
- Ajax的錯誤處理機制探討(1)
- 初次體驗.NET Ajax無重新整理技術
- Rails系統中的AJAX開發技術簡析(4)