爲了使自定義的服務器控件能夠處理回發事件,控件必須實現IPostBackEventHandler接口,這個接口有一個方法需要實現:void RaisePostBackEvent (string eventArgument),它用來處理將窗體發送到服務器時引發的事件。
如果我們希望實現一個按鈕控件,在點擊按鈕時觸發服務器端的Click事件,我們可以用一下代碼來實現:
{
public event EventHandler Click;
protected virtual void onClick(EventArgs e)
{
if (this.Click != null)
{
this.Click(this, e);
}
}
public void RaisePostBackEvent(string eventArgument)
{
this.onClick(new EventArgs());
}
protected override void Render(HtmlTextWriter output)
{
output.Write("<input type="submit" name="{0}" value="Click Me" />",
this.UniqueID);
}
}
在這段代碼中我們可以看到,當用戶點擊這個控件時,Html元素 <input type="submit"> 會引起頁面的回發,因爲MyButton實現了接口 IPostBackEventHandler,因此頁面回發時將調用控件的 RaisePostBackEvent 方法,從而引發我們定義的 Click 事件,這樣就達到了我們引發 Click 事件的目的。需注意的是引起回發的Html元素的name屬性值必須爲控件的 UniqueID,否則 RaisePostBackEvent 方法不會被調用。
這個控件的實現依賴於Html元素 <input type="submit"> 本身會引發頁面的回發,如果我們要自己引起回發,則需要藉助一段JavaScript,這段JavaScript可以由Page. GetPostBackClientHyperlink方法(在ASP.NET 2.0這個方法已過時,而需使用Page.ClientScript.GetPostBackClientHyperlink方法),這個方法的定義爲:public string GetPostBackClientHyperlink (Control control, string argument) 。其中的參數control 爲處理回發的服務器控件。argument 爲傳遞給服務器控件的參數,也就是處理回發事件的 RaisePostBackEvent 接收到的參數eventArgument。我們可以用這種方式實現一個可以定義服務器端Click事件的超鏈接:
{
public event EventHandler Click;
protected virtual void onClick(EventArgs e)
{
if (this.Click != null)
{
this.Click(this, e);
}
}
public void RaisePostBackEvent(string eventArgument)
{
this.onClick(new EventArgs());
}
protected override void Render(HtmlTextWriter output)
{
output.WriteLine("<a href="#" onclick="{0}">Click Me</a>",
this.Page.ClientScript.GetPostBackClientHyperlink(this, ""));
}
}
這個控件將在客戶端呈現爲 <a href="#" onclick="javascript:__doPostBack('ctl01','')">Click Me</a>,在點擊這個超鏈接時將會運行JavaScrpit腳本,引起頁面的回發,從而調用MyLink控件的RaisePostBackEvent方法。使用這種方式,無需將Html元素的name屬性設置爲UniqueID,但GetPostBackClientHyperlink方法的第一個參數必須是this。將GetPostBackClientHyperlink方法的第二個參數設爲不同的值,我們可以給控件定義多種事件,在RaisePostBackEvent方法中根據eventArgument值的不同而進行不同的事件處理。argument也可以用來傳遞事件的數據。
從上面我們可以看出腳本 __doPostBack('','') 將會引發控件的服務器端事件,因此我們設置可以將GetPostBackClientHyperlink方法形成的字符串傳入JavaScript腳本,用eval()直接運行,從而做到客戶端事件和服務器端事件的結合,實現更加複雜的功能。