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