ajax.dll和ajaxpro.dll的使用方法和基本原理

來源:互聯網
上載者:User

1.先把Ajax.dll添加引用到項目中,在項目上右擊,菜單上有個[添加引用],然後一步一步把那個.DLL檔案添加進來,之後你會在項目的引用中看到那個Ajax.dll就是添加成功了
2.修改Web.config。在 <system.web> 元素中添加以下代碼。這裡的Ajax.dll和Ajaxpro.dll引用方法是不一樣的,一定要注意
<configuration>
<system.web>
<httpHandlers>
<!-- Ajax.dll的設定檔寫法為,我下載到的是這個 -->
<add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" />
<!-- AjaxPro.dll的設定檔寫法為,根據你下載到的DLL檔案選擇不同的配置語句-->
<add verb="*" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro"/>
</httpHandlers>
</system.web>
</configuration>

3對AjaxPro用到的頁Page_Load事件中進行運行時註冊。如:
protected void Page_Load(object sender, EventArgs e)
{
Ajax.Utility.RegisterTypeForAjax(typeof(_Default));//是Ajax.dll的
AjaxPro.Utility.RegisterTypeForAjax(typeof(_Default));//Ajaxpro.dll的
}
//這的_Default是指頁面類的類名,就是這個頁面的名字。如是放在命名空間,則需要寫上完整的命名空間(如:namespaces._Default)

4建立伺服器端方法
[Ajax.AjaxMethod]//這句一定要有,如果你是Ajaxpro.dll就寫成[AjaxPro.AjaxMethod]
public string getValue(int a,int b)
{
//該方法我們將實現從用戶端傳入兩個數,在伺服器端相加計算後返回到用戶端。這裡可以寫在原來的頁後台中也可以單獨寫一個類。
return Convert.ToString(a+b);//這裡返回的就是前台得到的值,反正參數已經進CS檔案了,想怎麼操作就怎麼操作,包括讀庫都可以。
}
5 用戶端調用。
<%@ Page language="c#" Codebehind="WebPage1.aspx.cs" AutoEventWireup="false" Inherits="Web.WebPage1" %>
<script language="javascript">
function getValue()
{

//這裡如果是AjaxPro.dll就加Web._Default.getValue,如果是Ajax.dll就不用加命名空間如下
_Default.getValue(1,2,getGroups_callback);//該處即調用伺服器端的_Default.getValue方法。
//_Default就是寫getValue的那個類,如果寫在本頁CS裡就是WebPage1.getValue,1和2是參數。
//這在裡邊getGroups_callback指定的是個回呼函數,以接受伺服器端處理完後返回用戶端結果。
}

//這個方法使用者接受並處理伺服器端返回的結果。
function getGroups_callback(response)
{
var dt=response.value;//這個值就是最終傳回來的值,想怎麼用就怎麼用,反正回前台了。
document.getElementById("Div_1").innerHTML=dt;
}
</script>
<body>
<div id="Div_1"> </div>
<button onclick=getValue()>開始 </botton>
</body>

現在我們來分析一下如果點擊開始按鈕都執行了些什麼,首先在前台執行getValue()函數,getValue函數裡的 _Default.getValue(1,2,getGroups_callback);會執行背景CS函數,我覺得這裡才是AJAX的精髓,因為這裡的執行是通過Ajax組件無重新整理的執行後台CS函數的,通常我們要調用背景CS函數都是通過正常方法重新整理一下頁面執行後台綁定好的CS函數,這裡用Ajax就不用重新整理的執行背景那個getValue函數了,1和2是參數,要在getValue裡計算了,getGroups_callback這個參數是必須要有了,要不然你在CS裡傳東西回來用什麼接收呀,getValue函數在後台計算出結果來後,這種計算已經在後台了,想怎麼算就怎麼算,你想讀庫都沒問題,然後通過return傳回值,這個值是什麼都行,那怕是一段" <table> <tr> <td>HelloWorld </td> </tr> </table>"這樣的HTML代碼也行,前台用getGroups_callback()這個JS函數接收這個值,然後就是前台調用了,想怎麼用就怎麼用了唄,隨你喜歡,這就是AJAX啟動並執行一個過程,從前台無重新整理到後台,計算後再返回前台,怎麼樣,明白了沒

 

當然,我們不希望僅僅用這種強大的能力來警告使用者。這就是所有用戶端代理(如JavaScript Sample.ServerSideAd函數)還接受其他特性的原因。這種特性就是為了處理響應而調用的回呼函數:
Sample.ServerSideAdd(100,99, ServerSideAdd_CallBack);

function ServerSideAdd_CallBack(response){
if (response.error != null){
    alert(response.error);
    return;
}
alert(response.value);
}

 

從上述代碼中可以看到我們指定了另外一個參數。ServerSideAdd_CallBack(同樣參見上述代碼)是用於處理伺服器響應的用戶端函數。這個回呼函數接收一個響應對象,該對象公開了三個主要性質
Value——伺服器端函數實際返回的值(無論是字串、自訂對象還是資料集)。
Error——錯誤訊息,如果有的話。
Request——xml http請求的原始響應。
Context——內容物件。
首先我們檢查error只看看是否出現了錯誤。通過在伺服器端函數中拋出異常,可以很容易處理error特性。在這個簡化的例子中,然後用這個值警告使用者。Request特性可用於獲得更多資訊(參見下一節)。
處理類型
返回複雜類型
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)。
自訂轉換器
我們已經看到,Ajax .NET封裝器能夠處理很多不同的.NET類型。但是除了大量.NET類和內建類型以外,封裝器對不能正確返回的其他類型僅僅調用ToString()。為了避免這種情況,Ajax .NET封裝器允許開發人員建立對象轉換器,用於在伺服器和客戶機之間平滑傳遞複雜物件。
其他事項
在其他類中註冊函數
上面的例子中,我們的伺服器端函數都放在執行頁面背後的代碼中。但是,沒有理由不能把這些函數放在單獨的類檔案中。要記住,封裝器的工作方式是在指定類中發現所有帶Ajax.AjaxMethod的方法。需要的類通過第二個指令碼標籤指定。使用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

通過指定類的類型而不是頁面就可以讓Ajax封裝器建立代理:
private void Page_Load(object sender, EventArgs e){
    Ajax.Utility.RegisterTypeForAjax(typeof(AjaxFunctions));
    //
}

要記住,用戶端代理的名稱是<ClassName>.<ServerSideFunctionName>。因此,如果ServerSideAdd函數放在上面虛構的AjaxFunctions類中,用戶端調用就應該是: AjaxFunctions.ServerSideAdd(1,2)。

返回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;
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.