ASP.NET2.0中的callback實(shí)現(xiàn)機(jī)制
ASP.NET2.0中的callback實(shí)現(xiàn)機(jī)制
看到不少朋友最近在寫使用callback的文章,也有點(diǎn)手癢,也來涂鴉一下,挖掘挖掘callback的潛力。callback的一般使用方法還算簡(jiǎn)單,直接參照msdn的幫助和范例就足夠了。但是想要真正用好、用精,或者想開發(fā)一些基于callback機(jī)制的WEB組件,那么,就要先深入了解callback實(shí)現(xiàn)機(jī)制了。在本文中,Teddy將和您一起解析callback的整個(gè)調(diào)用、反饋機(jī)制,相信對(duì)于幫助您更好的使用callback,將能有一定的益處。
Callback vs Atlas
首先,談?wù)凙tlas。很多朋友可能會(huì)覺得奇怪,已經(jīng)有了Callback,為什么又要出Atlas呢?關(guān)于這個(gè)問題,Atlas的作者怎么解釋,我倒沒有去調(diào)查。只不過從我個(gè)人對(duì)callback和atlas的使用感受來講,覺得,callback作為一個(gè)接口和postback非常類似的實(shí)現(xiàn),肯定是為了讓用戶類似使用postback來使用它。但是,它的這個(gè)類似postback的機(jī)制,應(yīng)該說使用上還不是特別方便,也不易擴(kuò)展,當(dāng)然這是相比于其他的AJAX框架實(shí)現(xiàn)來說的。因此,微軟方面借鑒了許多的已有的AJAX實(shí)現(xiàn),如 Prototype,Backbase以及AJAX.NET,并結(jié)合ASP.NET2.0 的部分特有功能,發(fā)明了這樣一個(gè)博采眾長(zhǎng)的AJAX框架。基于Atlas來開發(fā)AJAX應(yīng)用有多好,很難量化的來說,但至少不比其他的這些AJAX框架來的差是肯定的,加上微軟這個(gè)后臺(tái),以及像live.com這樣的重量級(jí)站點(diǎn)的應(yīng)用推廣,其影響當(dāng)然是值得期待的。
不過,這也不是說callback實(shí)現(xiàn)沒一無(wú)是處了,作為程序員,我們需要有正確的態(tài)度,在正確的使用情形,使用最正確的技術(shù)。沒有哪一個(gè)框架是萬(wàn)能的,是適合任何使用環(huán)境的;就像大家都在爭(zhēng)論那個(gè)軟件開發(fā)方法最好,CMMi,RUP,XP,AGILE~~,其實(shí),沒有最好,最合適的才是最好的。我們最應(yīng)該做的,是了解各種方案的原理和優(yōu)缺點(diǎn),從而,合理的使用正確的工具來解決實(shí)際問題。
Begin from Client Script
我們都知道,凡是AJAX,從底層來講,無(wú)外乎兩種實(shí)現(xiàn)機(jī)制:XMLHTTP以及IFRAME。在AJAX這個(gè)詞獲得廣泛關(guān)注之前,其實(shí),基于這兩種底層實(shí)現(xiàn)的功能框架,或者基于這兩種技術(shù)的無(wú)刷新效果實(shí)現(xiàn)就已經(jīng)被廣泛的使用了。當(dāng)然,發(fā)展到今天,在使用接口方面,這些底層機(jī)制的細(xì)節(jié)往往被框架給隱藏了,使用接口變得越來越簡(jiǎn)單,用戶只要調(diào)用這些簡(jiǎn)單接口,沒有必要知道具體是怎么實(shí)現(xiàn)效果的了。
不過,這里我們既然是要解析callback實(shí)現(xiàn)機(jī)制,那還是讓我們從一個(gè)callback調(diào)用的客戶端腳本調(diào)用開始,看看,微軟是怎么實(shí)現(xiàn)這個(gè)callback機(jī)制的。
1、ClientScript.GetCallbackEventReference(...)
要激發(fā)一個(gè)callback,首先,當(dāng)然需要在客戶端本中發(fā)出一個(gè)調(diào)用。一個(gè)典型的調(diào)用語(yǔ)法如下:
- <script language="javascript" type="text/javascript">
- function any_script_function(arg, context)
- {
- <%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;
- }
- </script>
ClientScript.GetCallbackEventReference(...)將根據(jù)傳入的參數(shù)返回實(shí)際的回調(diào)腳本。這個(gè)函數(shù)有多個(gè)重載版本,因此,這些參數(shù)的含義,大家可以參考MSDN。以具體的上面這段示例代碼中的參數(shù)來說:
◆this表示執(zhí)行回調(diào)的的服務(wù)端控件是當(dāng)前這個(gè)Page,當(dāng)前的Page必須實(shí)現(xiàn)ICallbackEventHandler接口,包括必須實(shí)現(xiàn)string GetCallbackResult()和void RaiseCallbackEvent(eventArgument)這兩個(gè)接口函數(shù),這個(gè)參數(shù)也可以是指向某個(gè)WEB控件的引用,當(dāng)然,這個(gè)空間也必須實(shí)現(xiàn)ICallbackEventHandler接口;
◆"arg"是將被傳給RaiseCallbackEvent的參數(shù)eventArgument的值,可以使人以自定義格式的字符串;
◆"ReceiveServerData"是當(dāng)回調(diào)成功之后,處理返回內(nèi)容的客戶端腳本函數(shù)的名稱,這個(gè)函數(shù)必須存在于執(zhí)行回調(diào)的頁(yè)面,并且這個(gè)函數(shù)可以包含兩個(gè)參數(shù),例如:
- <script type="text/javascript">
- function ReceiveServerData(result, context)
- {
- }
- </script>
這兩個(gè)參數(shù),分別是回調(diào)的返回?cái)?shù)據(jù)result,和原封不動(dòng)被返回的我們激發(fā)回調(diào)時(shí)的這個(gè)context參數(shù),當(dāng)然,這兩個(gè)參數(shù)都是字符串類型的。
◆"context"就不用多解釋了,記得這個(gè)參數(shù)會(huì)被原封不動(dòng)的傳給指定的返回?cái)?shù)據(jù)處理函數(shù)就行了。MSDN的官方文檔說,context一般可用來傳遞需要在客戶端的返回?cái)?shù)據(jù)處理函數(shù)中用來調(diào)用的腳本代碼,不過實(shí)際上,你傳什么都可以,把它看成一種從客戶端回調(diào)的的激發(fā)端,到處理返回?cái)?shù)據(jù)的接收段之間的參數(shù)傳遞通道就行了。
2、WebForm_DoCallback(...)
Ok,明白了以上代碼的含義,下面我們來看看,前面的這條“<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;”在運(yùn)行時(shí)會(huì)被解析成什么樣子呢?我們只要在頁(yè)面運(yùn)行時(shí)察看頁(yè)面源碼就可以看到,實(shí)際上服務(wù)器幫我們生成了下面這段 script代碼:
- <scriptlanguagescriptlanguage="javascript"type="text/javascript">
- functionany_script_function()
- {
- WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false);
- }
- </script>
這段代碼是什么意思呢?很顯然的他調(diào)用了一個(gè)系統(tǒng)與定義的script函數(shù):WebForm_DoCallback。我們要把這個(gè)函數(shù)找出來看看它具體為我們干了什么。在運(yùn)行時(shí)的頁(yè)面源碼中,我們很容易可以找到這段腳本的出處。我們注意到有一個(gè)script,src="/TestCallbackWeb/WebResource.axd?d=HEcYmh-7_szSIu1D_mHSEw2&t=632661779991718750",這里就定義了WebForm_DoCallback。讓我們把它用flashget下載下來,將擴(kuò)展名改為.js。看看源碼吧,沒有被混淆的,所以很容易看明白。以上介紹ASP.NET2.0中的callback實(shí)現(xiàn)機(jī)制
【編輯推薦】

















