上一篇文章介紹了實現自訂伺服器控制項事件的基本概念。本文將通過典型樣本講解捕獲回傳事件的實現方法。
1. 實現捕獲回傳事件
如果伺服器控制項需要捕獲來自用戶端的回傳事件,並想為該回傳事件自訂伺服器端事件處理邏輯,那麼控制項必須實現System.Web.UI.IPostBackEventHandler介面。下面列舉了該介面定義。
public interface IPostBackEventHandler
{
void RaisePostBackEvent(string eventArgument);
}
如上代碼所示,IPostBackEventHandler介面僅包括一個成員方法RaisePostBackEvent。該方法使伺服器控制項能夠處理將表單發送到伺服器時引發的事件,其參數eventArgument表示要傳遞到事件處理常式的可選事件參數。開發人員可以在RaisePostBackEvent方法中實現伺服器控制項回傳過程中執行的邏輯。一般情況下,RaisePostBackEvent方法將引發一個或者多個伺服器端事件。以下程式碼片段顯示了在伺服器上引發Click事件的RaisePostBackEvent實現。
public void RaisePostBackEvent(String eventArgument)
{
OnClick(EventArgs.Empty);
}
實現捕獲回傳事件並不是僅僅使伺服器控制項類實現IPostBackEventHandler介面,並實現該介面成員方法就可以的。開發人員還需要注意實現其他內容。下面列舉了實現捕獲回傳事件程序中的三個要點。
第一,也是最重要的,即自訂伺服器控制項類必須實現IPostBackEventHandler介面,並實現該介面成員RaisePostBackEvent方法。這一過程在上文中已經進行了介紹。
第二,為控制項分配UniqueID。
定義引起回傳事件的控制項的name屬性值為UniqueID,是正確實現RaisePostBackEvent方法的關鍵之一。當引發回傳後,頁架構就會搜尋發送的內容,並確定發送對象的名稱是否與實現IPostBackEventHandler的伺服器控制項的UniqueID對應。如果對應,頁架構就會在該控制項上調用RaisePostBackEvent方法。這裡的重點是需要開發人員在呈現邏輯中,為控制項的name屬性分配UniqueID。下面列舉了一個簡單的程式碼範例。
protected override void Render(HtmlTextWriter output)
{
output.Write("<INPUT TYPE=submit name="+this.UniqueID+"Value='Click Me' />");
}
如上代碼所示,在控制項呈現方法Render中,呈現了一個按鈕,其name屬性值為UniqueID。只有為引起回傳的控制項的name屬性分配了UniqueID,才能夠正確實現捕獲回傳事件。
第三,實現事件屬性結構。
事件屬性結構是一種最佳化的事件實現方式。在介紹之前,我們首先看看常見的控制項事件實現方式。具體代碼如下所示。
......
public class WebCustomControl:WebControl,IPostBackEventHandler{
//聲明Click事件委託
public event EventHandler Click;
//實現RaisePostBackEvent方法
void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
OnClick(EventArgs.Empty);
}
//定義OnClick事件處理常式
protected virtual void OnClick(EventArgs e) {
if(Click != null) { Click(this,e); }
}
......
}