将MasterPage ImageButton事件传递给内容页面

时间:2009-10-14 23:43:23

标签: asp.net master-pages

我在Master Page中有ImageButton。我希望触发OnClick事件并被主页面内托管的.ASPX页面捕获?

母版

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

2 个答案:

答案 0 :(得分:8)

母版页实际上是页面的子页面(事实上,它是一个UserControl)。我们不希望页面必须知道其子控件的私密细节(这就是为什么我们首先将这些方面委托给那些控件),所以正确的方法是处理master上的click事件页面并从那里触发页面处理的母版页上的另一个事件:

站长:

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
}

答案 1 :(得分:1)

我建议在您的内容页面中指定强类型母版页,并在母版页面上公开该事件

这是一个很好的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
}