0、它是如何工作的
1、建立伺服器端函數
2、用戶端調用
3、回呼函數
4、處理類型
5、會話訪問
附錄
0、它是如何工作的
利用 Ajax封裝器,ASP.NET開發人員可以快速方便的部署很容易利用AJAX功能的頁面。
Ajax依靠代理(broker)指派和處理往返伺服器的請求,對此,封裝器的目的是隱藏 XmlHttpRequest對象的實現,封裝器本身通過將.NET函數標記為 Ajax方法來工作。標記之後,AJAX就建立對應的JavaScript函數,這些函數(和任何JavaScript函數一樣)作為代理可以在用戶端使用 XmlHttpRequest調用。這些代理再映射回伺服器端函數。
假設有一個.NET函數:
ublic int Add(int firstNumber, int secondNumber) { return firstNumber + secondNumber;}
封裝器將自動建立名為“Add”、帶有兩個參數的JavaScript函數。使用JavaScript(在客戶機上)調用該函數時,請求將傳遞給伺服器並把結果返回給客戶機。
1、建立伺服器端函數
⑴、項目中引用 Ajax.dll檔案。
⑵、編寫函數代碼
namespace ForAjax{ public class Example { [Ajax.AjaxMethod()] public static int ServerSideAdd(int firstNumber, int secondNumber) { return firstNumber + secondNumber; } }}
函數中包含 [Ajax.AjaxMethod()]屬性集。該屬性告訴封裝器這些方法建立javaScript代理,以便在用戶端調用。
2、用戶端調用
⑴、網站中引用 Ajax.dll及 伺服器專案檔。
⑵、web.config中建立HttpHandler
<configuration> <system.web> <httpHandlers> <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" /> </httpHandlers> </system.web></configuration>
註:在 IIS7上部署。
<system.webServer> <handlers> <add name="ajax" verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" /> </handlers></system.webServer>
⑶、用戶端頁面調用
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><html><head> <script language="javascript" src="ajax/common.ashx"></script> <script language="javascript" src="ajax/ForAjax.Example,ForAjax.ashx"></script> <script language="javascript"> var response = Example.ServerSideAdd(100,99); alert(response.value); </script> </head><body"> <form id="form1"> </form></body></html>
其中,"ajax/ForAjax.Example,ForAjax.ashx" 為 "ajax/Namespace.PageClass,AssemblyName.ashx"格式。可以在瀏覽器中手工導航到src路徑(查看原始碼,複製粘貼路徑)檢查是否一切正常。
通過 web.config,我們已經保證所有對 ajax/*.ashx的請求都由自訂的 Ajax封裝器處理。封裝器負責建立帶有兩個參數的 JavaScript函數 Sample.ServerSideAdd以供前台調用。
3、回呼函數
Sample.ServerSideAdd(100,99, ServerSideAdd_CallBack); function ServerSideAdd_CallBack(response){ if (response.error != null){ alert(response.error); return; } alert(response.value); }
其中響應對象 response公開了三個主要性質
- Value——伺服器端函數實際返回的值(無論是字串、自訂對象還是資料集)。
- Error——錯誤訊息,如果有的話。
- Request——xml http請求的原始響應。
- Context——內容物件。
4、處理類型
Ajax封裝器不僅能處理ServerSideAdd函數所返回的整數。它目前支援 integers、strings、double、booleans、DateTime、DataSets和DataTables,以及自訂類和數組等基本類型。其他所有類型都返回它們的ToString值。
⑴、返回的 DataSets
和真正的.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()]屬性標記。假設有如下的類:
[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註冊 GetUser代理:
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和UserId)。
⑶、返回 Unicode字元
Ajax .NET封裝器能夠從伺服器向客戶機返回Unicode字元。為此,資料在返回之前必須在伺服器上用html編碼。比如:
[Ajax.AjaxMethod]public string Test1(string name, string email, string comment){ string html = ""; html += "Hello " + name + "<br>"; html += "Thank you for your comment <b>"; html += System.Web.HttpUtility.HtmlEncode(comment); html += "</b>."; return html;}
⑷、自訂轉換器
我們已經看到,Ajax .NET封裝器能夠處理很多不同的.NET類型。但是除了大量.NET類和內建類型以外,封裝器對不能正確返回的其他類型僅僅調用ToString()。為了避免這種情況,Ajax .NET封裝器允許開發人員建立對象轉換器,用於在伺服器和客戶機之間平滑傳遞複雜物件。
5、會話訪問
[Ajax.AjaxMethod(Ajax.HttpSessionStateRequirement.Read)]public void DocumentReleased(){ if (System.Web.HttpContext.Current.Session["DocumentsWaiting"] == null) { //... } }
附錄:
ASP.NET下利用ajax.dll進行Ajax開發
ASP.NET 調味品:AJAX