ASP.NET組件設(shè)計之傳輸機制淺析
ASP.NET組件設(shè)計之傳輸機制的討論:
ASP.NET頁面如果是通過post請求到服務(wù)器,框架將會遵行事件周期生成、調(diào)用控件,而控件(如果支持回傳)則將加載回傳數(shù)據(jù),并且映射成控件的服務(wù)器端事件,就好像在重放客戶的客戶行為(客戶按下一個按鈕,卻引發(fā)服務(wù)器端控件的click事件)。其中的機制如何?
ASP.NET組件設(shè)計之傳輸機制的問題:如果一個控件需要處理回傳事件,那么必須實現(xiàn)一個特定接口 IPostBackEventHandler接口:
- public interface IPostBackEventHandler{
- void RaisePostBackEvent(string eventArgument);
- }
ASP.NET組件設(shè)計之傳輸機制的另外一個接口:
- IPostBackDataHandler
- {
- bool LoadPostData( string postDataKey, NameValueCollection postCollection);
- void RaisePostDataChangedEvent();
- }
一旦控件實現(xiàn)了這些接口,頁面框架就會自動在PostBack數(shù)據(jù)完成后,調(diào)用控件的此接口IPostBackDataHandler。LoadPostData,從而讓控件讀取post上來的數(shù)據(jù)。PostDataKey為PostBack數(shù)據(jù)中的命名鍵名,通過NameValueCollection[postDataKey]可以獲得頁面框架傳遞給控件的值。控件應(yīng)當(dāng)讀取此值,進行自己內(nèi)部狀態(tài)更新,反映狀態(tài)變化。如果控件返回真,表示服務(wù)器控件狀態(tài)改變,此時頁面框架會立即調(diào)用此控件的RaisePostDataChangedEvent方法。此時,控件應(yīng)當(dāng)自己定義該引發(fā)那些服務(wù)器控件對外提供的事件。這些事件往往是控件編程者精心設(shè)計留給使用這控鍵的aspx編程者的代碼舞臺。
至于另一個接口IPostBackEventHandler,也是回傳時候服務(wù)器調(diào)用的接口。我們知道每一個控件都有一個UniqueID,當(dāng)客戶端觸發(fā)一個可以引起回傳的客戶端事件(譬如按下了submit按鈕),那么自然HTTP Post數(shù)據(jù)到服務(wù)器端,服務(wù)器頁面框架進行到PostBack處理時候,會檢索控件是否支持IpostBackEventHandler接口,并且查找控件的UniqueID發(fā)現(xiàn)支持就立即調(diào)用此接口的RaisePostBackEvent方法,表示UniqueID的控件發(fā)生了一個需要捕獲的事件。很明顯,并非客戶端所有事件都可以投射到服務(wù)器端,只能夠是能夠引發(fā)Post Back(也就是能夠提交表單數(shù)據(jù)到服務(wù)器的事件)的事件和控件。注意,這里嚴格要求了UniqueID必須在服務(wù)器端和客戶端對應(yīng)一致,否則無法映射事件。
值得控件編寫者注意的是,如果要實現(xiàn)接口,需要如下實現(xiàn)接口,而不是通常的僅僅接口方法名同名即可:
- void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
- {
- ……
- }
ASP.NET組件設(shè)計之傳輸機制的實現(xiàn)接口方面也就是說,接口針對頁面框架實現(xiàn)的,也由頁面框架調(diào)用。
另一方面,在客戶端,能夠引起回傳的實際上僅有2個HTML元素﹤inoput type=submit ﹥和﹤input type=image,但是通過客戶端腳本,其他客戶端事件也可導(dǎo)致回傳數(shù)據(jù)到服務(wù)器端。Page類提供了一系列的方法來幫助實現(xiàn)其他可引發(fā)回傳的途徑:
- public string GetPostBackClientEvent(
- Control control,
- string argument
- );
獲取對客戶端腳本函數(shù)的引用,該函數(shù)在被調(diào)用時將導(dǎo)致服務(wù)器回發(fā)到窗體。
- public string GetPostBackClientHyperlink(
- Control control,
- string argument
- );
將 javascript: 追加到從 GetPostBackEventReference 調(diào)用的返回的開頭,從而使服務(wù)器上可以進行超級鏈接回發(fā)處理。
- public string GetPostBackEventReference(Control);
- public string GetPostBackEventReference(Control, string);
獲取對客戶端腳本函數(shù)的引用,調(diào)用該函數(shù)將使服務(wù)器
如果一個控件確定通過以上方法確保客戶端引發(fā)回傳事件,那么控件引用頁將導(dǎo)致最終輸出到客戶端的HTML中包含腳本,并且腳本中藏有如下隱含變量:
- ﹤input type=”hidden” name=”__EVENTTARGET” value=””﹥
- ﹤input type=”hidden” name=”__EVENTARGUMENT” value=””﹥
- ﹤script language=”javascript”﹥
- ﹤!—
- function __doPostBack(eventTarget,eventArgument)
- {
- var theform=document._ct10;
- theform.__EVENTTARGET.value= eventTarget;
- theform.__EVENTARGUMENT.value= eventArgument;
- }
- -- ﹥
- ﹤/script﹥
任何客戶端腳本只要合法調(diào)用了__doPostBack方法即可實現(xiàn)回傳到服務(wù)器端,并且服務(wù)器端也知道了是引發(fā)了那一個UniqueID得控件的事件。
ASP.NET組件設(shè)計之傳輸機制方面的內(nèi)容就簡單的向你介紹到這里,希望對你學(xué)習(xí)ASP.NET組件設(shè)計之傳輸機制有所幫助。
【編輯推薦】