利用ajax.dll進行asp.net ajax開發
Asynchronous JavaScript and XML(AJAX)最近(jìn)掀起的高潮,要完全歸功於Google在Google Suggest和Google Maps中的使用。對ASP.NET而言,AJAX不需(xū)要回(huí)傳就能(néng)進(jìn)行服務器(qì)端處理,從而使客戶機(瀏覽器(qì))具有豐富的服務(wù)器端能力。換(huàn)句話說,它為異步指(zhǐ)派和處理請求與服務器響應提供(gòng)了一個框架。AJAX利用了一些不是很新穎的已有技術,但是對這些技術(加到一起就是AJAX)的愛(ài)好最近突然升溫。
請嚐試Michael Schwarz的AJAX .NET包裝器,通過它ASP.NET開發人員(yuán)可以快速方便的部署很容易利用AJAX功能的頁麵。需要注意(yì)的是,這個包裝器處(chù)於初期開發階段,因此還沒有完全成熟。
它是如何工作的——概述(shù)
AJAX依靠代理(broker)指派和處理往返服務器的請求。對此(cǐ),.NET包裝器依靠客戶端XmlHttpRequest對象。多(duō)數瀏覽器都支持XmlHttpRequest對象(xiàng),這就是選擇它的原因。因為包裝器的目的是(shì)隱藏XmlHttpRequest的實現,我們就不再詳細討論它了(le)。
包裝器本身通過將.NET函數標記為AJAX方法(fǎ)來工(gōng)作。標(biāo)記(jì)之後(hòu),AJAX就創建對應的JavaScript函數,這些函(hán)數(和任(rèn)何JavaScript函數一樣)作為代理可以在客戶端使用XmlHttpRequest調用。這些代理再映射回服務器端函數。
複雜嗎?並不(bú)複雜。我(wǒ)們來看一個例子。假設有一個.NET函數:
ublic int Add(int firstNumber, int secondNumber)
{
return firstNumber + secondNumber;
}
AJAX .NET包裝器將(jiāng)自動(dòng)創建名為“Add”、帶有兩個參(cān)數的JavaScript函數。使用JavaScript(在客戶機上)調用該函數(shù)時,請求將傳遞給服務器(qì)並把結果(guǒ)返回給客戶機。
初始(shǐ)設置
我們首先介紹“安裝”項目中使用的.dll的(de)步驟。如果您很清楚如何添加.dll文件引用,可以跳過這一節(jiē)。
首先,如(rú)果還沒有的話,請下載最新的AJAX版本。解壓下載的文件並把ajax.dll放到項目的(de)引用文件夾中。在Visual Studio.NET中有機Solution Explorer的“References(引用)”節點並選擇Add Reference(添加引用)。在打開的對(duì)話(huà)框中,單擊Browse(瀏覽)並找到ref/ajax.dll文件。依次單擊Open(打(dǎ)開)和Ok(確認)。這(zhè)樣就可以用AJAX .NET包裝器編程了。
建立HttpHandler
為了保證正常工作,第一步是(shì)在web.config中設置包裝器的HttpHandler。不(bú)需要詳細解釋HttpHandlers是什麽(me)及其如何工作,隻要知道它們用(yòng)於處理ASP.NET請求就足夠了。比如,所有*.aspx頁麵請求都(dōu)由
System.Web.UI.PageHandlerFactory類處理。類似的,我(wǒ)們讓所有(yǒu)對ajax/*.ashx的請求由Ajax.PageHandlerFactory處理:
〈configuration>
〈system.web>
〈httpHandlers>
〈add verb="POST,GET" path="ajax/*.ashx"
type="Ajax.PageHandlerFactory, Ajax" />
〈/httpHandlers>
〈system.web>
〈/configuration>
簡言之,上麵的代(dài)碼告訴ASP.NET,和指定路徑(jìng)(ajax/*.ashx)匹配的任何請求都由Ajax.PageHandlerFactory而不是默認處理程序工(gōng)廠來處理(lǐ)。不需要創建ajax子目錄(lù),使(shǐ)用這個神秘的目錄隻是為了讓其他HttpHandlers能夠在自己建立的子目錄中使用(yòng).ashx擴展。
建立頁麵
現(xiàn)在我們可以開始編碼了。創建一個新(xīn)頁麵或者打開已有的(de)頁(yè)麵,在file後的代碼(mǎ)中,為Page_Load事(shì)件添加以下(xià)代碼:
public class Index : System.Web.UI.Page{
private void Page_Load(object sender, EventArgs e){
Ajax.Utility.RegisterTypeForAjax(typeof(Index));
//
}
//
}
調用RegisterTypeForAjax將在頁麵上(shàng)引發後麵的JavaScript(或者(zhě)在頁麵中(zhōng)手工加入以下兩行代碼):
〈script language="javascript" src="ajax/common.ashx">〈/script>
〈script language="javascript"
src="ajax/Namespace.PageClass,AssemblyName.ashx">〈/script>
其(qí)中最後(hòu)一行的含義(yì)是(shì):
Namespace.PageClass——當前頁麵的名稱空間和類(通常是@Page指令中Inherits屬性的值)
AssemblyName——當前頁麵(miàn)所(suǒ)屬程序集的名稱(通常就是項目名)
下麵是AjaxPlay項(xiàng)目(mù)中sample.aspx頁麵的結果例子:
〈%@ Page Inherits="AjaxPlay.Sample" Codebehind="sample.aspx.cs" %>
〈html>
〈head>
〈script language="javascript" src="ajax/common.ashx">〈/script>
〈script language="javascript"
src="ajax/AjaxPlay.Sample,AjaxPlay.ashx">〈/script>
〈/head>
〈body>
〈form id="Form1" method="post" runat="server">
〈/form>
〈/body>
〈/html>
可以在瀏覽器中手工導航到src路(lù)徑(查看源代碼,複(fù)製粘貼路(lù)徑)檢查是否一(yī)切正常(cháng)。如果(guǒ)兩個路徑都輸(shū)出一些(似乎(hū))毫無意義的文本,就萬事大(dà)吉了。如果什麽也沒輸出或者出現ASP.NET錯誤,則表(biǎo)明有些地方(fāng)出現問題(tí)。
即便不(bú)知道HttpHandlers如何工作,上麵的例子也很容易理解。通過web.config,我們已經保證(zhèng)所(suǒ)有(yǒu)對ajax/*.ashx的請求都(dōu)由自定義的處理(lǐ)程序處理。顯然,這裏的(de)兩個腳本標(biāo)簽(qiān)將由(yóu)自定義的處理程序處理。
創建服務器端函數
現在來創建可從客戶端調用中異步訪問的服務器端函數。因為目前還不支持所有(yǒu)的(de)返回類型(不用擔心,將在目前的基礎(chǔ)上開發新的(de)版本),我(wǒ)們繼續(xù)使用簡單的ServerSideAdd函數吧。在file後的代碼中,向頁麵添加下列代碼:
[Ajax.AjaxMethod()]
public int ServerSideAdd(int firstNumber, int secondNumber)
{
return firstNumber + secondNumber;
}
要注意,這些(xiē)函數具有Ajax.AjaxMethod屬性集。該屬性告訴包裝器這些方法創建javaScript代理,以便在客戶端調用(yòng)。
客戶端調用
最後一步(bù)是(shì)用(yòng)JavaScript調用該函數。AJAX包裝器負責創建帶有兩個參數的(de)JavaScript函數Sample.ServerSideAdd。對這種最簡單的函數,隻需要調用該方法並傳遞兩個數字:
〈%@ Page Inherits="AjaxPlay.Sample" Codebehind="sample.aspx.cs" %>
〈html>
〈head>
〈script language="javascript" src="ajax/common.ashx">〈/script>
〈script language="javascript"
src="ajax/AjaxPlay.Sample,AjaxPlay.ashx">〈/script>
〈/head>
〈body>
〈form id="Form1" method="post" runat="server">
〈script language="javascript">
var response = Sample.ServerSideAdd(100,99);
alert(response.value);
〈/script>
〈/form>
〈/body>
〈/html>
當然,我們不希望僅僅用(yòng)這種強大的能力來警告用戶。這就是所有(yǒu)客(kè)戶端代理(lǐ)(如JavaScript Sample.ServerSideAd函數)還接受其他(tā)特性的原因。這(zhè)種特性就(jiù)是為了處理響應而調用的回調函數:
Sample.ServerSideAdd(100,99, ServerSideAdd_CallBack);
function ServerSideAdd_CallBack(response){
if (response.error != null){
alert(response.error);
return;
}
alert(response.value);
}
從上述代碼中可以看到我們指定了(le)另外一個參數(shù)。ServerSideAdd_CallBack(同樣參(cān)見上述代碼)是用於處理服務器響應的客戶端函數。這個(gè)回調函(hán)數接收一個響應對象,該對象(xiàng)公開了三個主要性質
Value——服務器端函(hán)數實際返回(huí)的值(無論是字符(fú)串、自(zì)定義對象還是數據集)。
Error——錯誤消息,如果有的話。
Request——xml http請求的原始響應(yīng)。
Context——上下文對象。
首先我們(men)檢查error隻看看是否出(chū)現了錯誤。通過在服務(wù)器端函數中拋出異常,可(kě)以很容易處理error特性。在這個簡化的例子中,然後(hòu)用這個值(zhí)警告用(yòng)戶。Request特性可用於獲得更多信息(參見(jiàn)下一節)。
處理類(lèi)型
返回複雜類(lèi)型
Ajax包裝器不僅能處理ServerSideAdd函數所返回的(de)整數。它目前還(hái)支持integers、strings、double、booleans、DateTime、DataSets和DataTables,以及自定義(yì)類和數組等基本類型。其他所有類型都返回它們(men)的ToString值(zhí)。
返回的DataSets和真正的.NET DataSet差不多。假設一個服務器端函數(shù)返回DataSet,我們可以通過下麵(miàn)的代碼在客戶端顯示其中的內容:
〈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] = &qu
關鍵詞:ajax.dll,asp.net,ajax
閱讀本文後您有什麽感想(xiǎng)? 已有 人給出評價!
- 2
- 2
- 2
- 2
- 2
- 2