AJAX在去年已經(jīng)接觸過(guò),但都是使用手動(dòng)的方法編寫(xiě)客戶端代碼,再加上被請(qǐng)求的頁(yè)面,感覺(jué)非常累,雖然早聽(tīng)說(shuō)過(guò)AJAX.NET和其他一些第3方開(kāi)發(fā)的框架,卻一直沒(méi)有時(shí)間來(lái)體驗(yàn)。今天干完手上的活,下了個(gè)最新版本的AJAX.NET體驗(yàn)了下
我使用的還是VS2003,下載了個(gè)最新版本的AJAX.NET 6.4.5.1,下載地址:www.schwarz-interactive.de 下面說(shuō)說(shuō)使用方法:
1、準(zhǔn)備工作
新建項(xiàng)目,使用.NET1.1就引用下載下來(lái)的AJAX.NET的類庫(kù)AjaxPro.dll,如果是使用.NET2.0 就引用AjaxPro2.dll
首先修改WEB.CONFIG文件
?在<system.web> 節(jié)點(diǎn)內(nèi)增加
<httpHandlers>
???? <addverb="*"path="*.ashx"type="AjaxPro.AjaxHandlerFactory,AjaxPro"/>
</httpHandlers>
2、然后在Page_Load事件中注冊(cè)頁(yè)面類
如我將使用AJAX的頁(yè)面類名為‘AjaxControls’,注冊(cè)語(yǔ)句就這樣寫(xiě):
?????
AjaxPro.Utility.RegisterTypeForAjax(typeof(AjaxControls));
紅字的地方是我的頁(yè)面的類名
這句的作用實(shí)際上是在頁(yè)面被請(qǐng)求的時(shí)候生成幾句調(diào)用JS的SCRIPT代碼
3、編寫(xiě)服務(wù)器端處理函數(shù)
????????如:
???????? [AjaxPro.AjaxMethod]
???????? [AjaxPro.AjaxMethod]
???????? publicstring Fun(string str)
???????? {
????????????? return str;
???????? }
‘[AjaxPro.AjaxMethod]’這句是關(guān)鍵,函數(shù)或方法寫(xiě)法沒(méi)什么特別的地方,只是要使用這句聲明這個(gè)函數(shù)是由AJAX.NET在頁(yè)面異步請(qǐng)求的,總之記住要通過(guò)AJAX獲得數(shù)據(jù)的后臺(tái)函數(shù)就使用[AjaxPro.AjaxMethod]來(lái)聲明一下。
‘[AjaxPro.AjaxMethod]’這句是關(guān)鍵,函數(shù)或方法寫(xiě)法沒(méi)什么特別的地方,只是要使用這句聲明這個(gè)函數(shù)是由AJAX.NET在頁(yè)面異步請(qǐng)求的,總之記住要通過(guò)AJAX獲得數(shù)據(jù)的后臺(tái)函數(shù)就使用[AjaxPro.AjaxMethod]來(lái)聲明一下。
另外,在AJAX.NET中如果處理函數(shù)需要對(duì)SESSION進(jìn)行操作,‘[AjaxPro.AjaxMethod]’需要改成‘[AjaxPro.AjaxMethod(AjaxPro.HttpSessionStateRequirement.ReadWrite)]’在 [AjaxPro.AjaxMethod(AjaxPro.……)]? 的‘……?’部分ajax.net還提供了其他很多方法,可以處理一些特殊的請(qǐng)求。
還有一點(diǎn)注意,如果使用Application,直接讀取或?qū)懭階pplication也是不行的,需要使用HttpContext.Current.Application,同樣對(duì) Request的訪問(wèn)也需要使用HttpContext.Current.Request。原因是直接使用的Application 或Request等 都是由Page類繼承下來(lái)的,而用Ajax.net對(duì)后臺(tái)方法訪問(wèn)的時(shí)候,這些方法并不屬于Page類。但是Session比較特殊,使用 HttpContext.Current.Session仍然不能訪問(wèn),必須使用上面一段所用的方法并且直接就用Session就行。
4、客戶端代碼
在我的這個(gè)示例中,使用‘Ajax.AjaxControls.Fun("測(cè)試用的傳遞的字符串參數(shù)");’請(qǐng)求后臺(tái)的函數(shù),然后返回一個(gè)OBJECT對(duì)象,這個(gè)OBJECT的VALUE屬性就可以得到后臺(tái)函數(shù)的返回值
如:
function doTest()
{
var?getobject = Ajax.AjaxControls.Fun("測(cè)試用的傳遞的字符串參數(shù)");
alert(getobject.value);
}
Ajax 是我這個(gè)項(xiàng)目的命名空間
AjaxControls 是我這個(gè)頁(yè)面的的類名
Fun 很明顯就是聲明了的那個(gè)AJAX可調(diào)用的方法名
()中的參數(shù)也就是我的Fun函數(shù)所需要的參數(shù)
doTest() 只是一個(gè)客戶段的函數(shù),可以綁到控件的事件中,也可以已不用事件,隨便怎么處理
客戶端異步請(qǐng)求這個(gè)函數(shù)所得到的和平時(shí)我們用函數(shù)返回的稍微不同的就是,平時(shí)直接得到函數(shù)類型的返回值,而使用AJAX.NET客戶端異步請(qǐng)求后臺(tái)函數(shù)得到的是個(gè)OBJECT,要通過(guò)這個(gè)OBJECT的VALUE屬性才能得到函數(shù)返回的值。
通常這里的客戶段腳本還可以這樣寫(xiě):
?
function doTest()
{
Ajax.AjaxControls.Fun("測(cè)試用的傳遞的字符串參數(shù)",getdata);
}
function getdata(rv)
{
????alert(rv.value);
}
Ajax.AjaxControls.Fun 中的參數(shù)除了對(duì)應(yīng)后臺(tái)函數(shù)的參數(shù)外,最后可以使用一個(gè)表達(dá)式參數(shù),這個(gè)參數(shù)是某個(gè)客戶段函數(shù)名,設(shè)置后,Ajax.AjaxControls.Fun請(qǐng)求后所獲得OBJECT對(duì)象將被做為 表達(dá)式參數(shù)函數(shù)的一個(gè)參數(shù)傳遞到該函數(shù)中,然后通過(guò)這個(gè)OBJECT參數(shù)的VALUE就可以獲得 AJAX請(qǐng)求后臺(tái)函數(shù)所返回的值了
通過(guò)這幾個(gè)步驟 就可以做出一個(gè)簡(jiǎn)單的使用Ajax.net結(jié)合.NET的示例頁(yè)面了。
下面說(shuō)說(shuō)用后的感受:
總體感覺(jué)上使用起來(lái)很方便,很簡(jiǎn)單,但是功能不夠強(qiáng)大,也許是我初次涉及的緣故,還沒(méi)摸索出更高級(jí)的使用方法,但是在對(duì)服務(wù)器控件的控制上基本不能實(shí)現(xiàn),需要使用其他方法如獲得控件輸出樣式,然后通過(guò)客戶端方法加載,還有除了能異步的獲得后臺(tái)請(qǐng)求的函數(shù)或方法的返回值之外,其他更具體復(fù)雜的操作都需要手動(dòng)的寫(xiě)代碼解決,不過(guò)確實(shí)是不錯(cuò)的東西,可以很快速的完成某些AJAX的效果。也許還有很多更強(qiáng)大的功能我還沒(méi)摸索到,希望大家指教