ASP.NET2.0中創建基於XML應用程序(1)

爲了使自定義的服務器控件能夠處理回發事件,控件必須實現IPostBackEventHandler接口,這個接口有一個方法需要實現:void RaisePostBackEvent (string eventArgument),它用來處理將窗體發送到服務器時引發的事件。

如果我們希望實現一個按鈕控件,在點擊按鈕時觸發服務器端的Click事件,我們可以用一下代碼來實現:

    

 

    public class MyButton : System.Web.UI.WebControls.WebControl, IPostBackEventHandler 
    
{
        
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 class MyLink : System.Web.UI.WebControls.WebControl, IPostBackEventHandler
    
{
        
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()直接運行,從而做到客戶端事件和服務器端事件的結合,實現更加複雜的功能。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章