2009-10-14 79 views
4

我在MasterPage中有ImageButton。我想讓OnClick事件觸發並被MasterPage中託管的.ASPX頁面捕獲?將MasterPage ImageButton事件傳遞給內容頁面

母版:

<asp:ImageButton ID="btnClear" OnClick="Clear_Click" 
ImageUrl="images/Back_Icon_06.png" runat="server" AlternateText="Clear" 
width="38" height="39"/> 

回答

8

母版實際上是頁面的孩子(其實,這是一個用戶控件)。我們不希望頁面必須知道其子控件的私密細節(這就是爲什麼我們首先將這些方面委託給這些控件),所以正確的方法是處理主控上的點擊事件頁面,並從那裏開槍該頁面處理母版另一個事件:

站長:

public event EventHandler SomethingHappened; 

protected void Button_Click(object sender, EventArgs e) 
{ 
    OnSomethingHappened(EventArgs.Empty); 
} 

protected void OnSomethingHappened(EventArgs e) 
{ 
    if(this.SomethingHappened != null) 
    { 
     this.SomethingHappened(this, e); 
    } 
} 

頁:

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    //allows us to change master pages 
    if(this.Master is MyMaster) 
    { 
     ((MyMaster)this.Master).SomethingHappened += new EventHandler(HandleSomethingHappened); 
    } 
} 

private void HandleSomethingHappened(object sender, EventArgs e) 
{ 
    //deal with it 
} 
+0

非常好,我用UserControls和Pages做了這個(在它上面回答了SO問題),但對MasterPage不確定。解釋讚賞;我不知道它像一個UserControl一樣被處理。額外的MyMaster支票是一個很好的補充。 – 2009-10-15 01:20:45

+0

@Rex M,非常感謝你挽救了我的時間:) – 2012-04-11 05:48:41

1

我會推薦指定強類型的母版頁我n您的內容頁面,並暴露在母版頁側

事件在這裏是一個很好的MSDN reference

這類似於what Rex M specified只是簡化了訪問母版頁一點點。

// Master Page Code 
public event EventHandler ClearClick 
{ 
    add 
    { 
     this.btnClear.Click += value; 
    } 
    remove 
    { 
     this.btnClear.Click -= value; 
    } 
} 

// Content Page markup 
<%@ Page masterPageFile="~/MasterPage.master"%> 

<%@ MasterType virtualPath="~/MasterPage.master"%> 

// Content Page Code 
protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    this.Master.ClearClick += new EventHandler(OnClearClick); 
} 

private void OnClearClick(object sender, EventArgs e) 
{ 
    // Handle click here 
} 
+0

我不鼓勵創建一個「傳遞」事件 - 頁面不應該知道另一個類中的特定元素或他們自己的事件。相反,主頁中的按鈕點擊事件應該表示發生了更重要的事情 - 例如,按鈕點擊的目的。 – 2009-10-15 00:19:21