上一篇文章介紹了實現自定義服務器控件事件的基本概念。本文將通過典型示例講解捕獲回傳事件的實現方法。
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); }
}
......
}