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編碼的