利用Ajax.dll進行Ajax開發

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.