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