Sample.ServerSideAdd(100,99, ServerSideAdd_CallBack); function ServerSideAdd_CallBack(response){ if (response.error != null){ alert(response.error); return; } alert(response.value); } |
从上面的代码中可以看出,我们为ServerSideAdd函数增加了一个额外参数ServerSideAdd_CallBack,这个参数就是用来处理 服务器端响应的客户端函数 。这个callback函数接受一个带有四个关键属性的response对象:
value | 服务器端函数执行的返回值(可能是一个字符串、自定义对象或者dataset) |
error | 如果发生错误,则返回错误信息. |
request | 原始的xmlHttpRequest请求 |
context | 一个上下文对象 |
我们首先应该检查是否有错误发生,你可以通过在 服务器端函数抛出异常来实现这个error属性 。在上面这个例子中,我们简单的alert了一个值,就是value属性;request属性可以用来取得额外的信息(见下面的表格)
如果你想了解更多的关于XmlHttpRequest的知识,可以查看下面的链接: http://www.quirksmode.org/blog/archives/2005/02/xmlhttp_linkdum.html |
处理类型
返回一个复杂类型
Ajax可以支持除了我们上面ServerSideAdd函数返回的Int值以外很多类型 。他可以直接支持integers, strings, double, booleans, DateTime, DataSets 和 DataTables,也支持简单的自定义类型和数组 。其他的类型通过其ToString方式来返回字符串 。
返回DataSet的工作就像真正的.net Dataset.给出一个返回DataSet的 服务端函数,我们可以通过下面的方法在客户端显示:
<script language="JavaScript"> //Asynchronous call to the mythical "GetDataSet" server-side function function getDataSet(){ AjaxFunctions.GetDataSet(GetDataSet_callback); } function GetDataSet_callback(response){ var ds = response.value; if(ds != null && typeof(ds) == "object" && ds.Tables != null){ var s = new Array(); s[s.length] = "<table border=1>"; for(var i=0; i<ds.Tables[0].Rows.length; i++){ s[s.length] = "<tr>"; s[s.length] = "<td>" + ds.Tables[0].Rows[i].FirstName + "</td>"; s[s.length] = "<td>" + ds.Tables[0].Rows[i].Birthday + "</td>"; s[s.length] = "</tr>"; } s[s.length] = "</table>"; tableDisplay.innerHTML = s.join(""); } else{ alert("Error. [3001] " + response.request.responseText); } } </script> |
Ajax也可以支持自定义类,但是需要这个类是可以被序列化的 。如下面的类:
[Serializable()] public class User{ private int _userId; private string _firstName; private string _lastName; public int userId{ get { return _userId; } } public string FirstName{ get { return _firstName; } } public string LastName{ get { return _lastName; } } public User(int _userId, string _firstName, string _lastName){ this._userId = _userId; this._firstName = _firstName; this._lastName = _lastName; } public User(){} [AjaxMethod()] public static User GetUser(int userId){ //Replace this with a DB hit or something :) return new User(userId,"Michael", "Schwarz"); } } |
我们需要通过调用RegisterTypeForAjax向 服务器注册User代理: