DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> AJAX入門 >> AJAX詳解 >> ajax.dll和ajaxpro.dll
ajax.dll和ajaxpro.dll
編輯:AJAX詳解     

應用篇,這以下的東西會借鑒網上其他人的文章,在這裡聲明一下

1.先把Ajax.dll添加引用到項目中,別告訴我不會,如果連這個也不會就太那個了,和添加其他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;
}

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved