C# 如何在母版页中使用按钮,并在内容页中使用不同的按钮

C# 如何在母版页中使用按钮,并在内容页中使用不同的按钮,c#,asp.net,C#,Asp.net,我的母版页中有一个按钮: <asp:Button ID="tyt" runat="server" ClientIDMode="Static" OnClick="tyt_Click" UseSubmitBehavior="false" Text="SUBMIT A MESSAGEBOX" /> public void tyt_Click(object sender, EventArgs e) { OnMasterControlClick(e);

我的母版页中有一个按钮:

<asp:Button ID="tyt" runat="server" ClientIDMode="Static" OnClick="tyt_Click" UseSubmitBehavior="false" Text="SUBMIT A MESSAGEBOX" />
public void tyt_Click(object sender, EventArgs e)
        {
            OnMasterControlClick(e);
        }
        protected void OnMasterControlClick(EventArgs e)
        {
            if (this.MasterControlClicked != null)
            {
                this.MasterControlClicked(this, e);
            }
        }
page1.aspx中的以下内容:

protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            if (this.Master is Site)
            {
                ((Site)this.Master).MasterControlClicked += new EventHandler(ContentControlClicked);
            }
        }
        private void ContentControlClicked(object sender, EventArgs e)
        {
            MessageBox.Show("your task");
        }
page2.aspx中的以下内容:

protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            if (this.Master is Site)
            {
                ((Site)this.Master).MasterControlClicked += new EventHandler(ContentControlClicked);
            }
        }
        private void ContentControlClicked(object sender, EventArgs e)
        {
            MessageBox.Show("your task");
        }
如果我在page1.aspx上,则仅显示
您的任务
,但当我在page2.aspx上并按下按钮时,页面将重新加载


如何修复它?

另一种添加事件处理程序的方法是使用委托操作或Func for handler

在母版页中

public Action MyButtonCallBack {get; set;}
在子页面中

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    if (this.Master is Site)
    {
        ((Site)this.Master).MyButtonCallBack = DoSomething;
    }
}

private void DoSomething() 
{
    //...
}

这可以通过一个接口来解决。创建定义所需操作的接口

public interface IActionPage
{
    void Action();
}
然后让每个页面实现该接口

public partial class _Default : System.Web.UI.Page, IActionPage
{ 
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    public void Action()
    {
        MessageBox.Show("your task");
    }
}
最后,让母版页的按钮将当前页面转换为接口,然后调用该方法

protected void tyt_Click(object sender, EventArgs e)
{
    var ActionPage = this.Page as IActionPage;
    if (ActionPage != null)
        ActionPage.Action();
}

我认为最好在你的母版上有一个容器,然后在每个页面上添加按钮,使用propper事件。在OnInit时添加新的EventHandler将使您有多个事件正在执行,因为它是一个多播代理,我试图避免在每个页面上添加,因为按钮将保持不变,但在不同的页面上它将执行不同的任务。我同意@pollirrata。此外,虽然您知道此按钮要使用的模式,但如何阻止其他人稍后在处理此单击事件的页面上添加处理该事件的用户控件(或2或3)?您将无法知道有人引入了这种可能不受欢迎的行为,并且很难进行调试。如果您可以更具体地说明您试图用这段代码实现什么,我们可能可以提供一种替代方案,它不需要在每个页面上都添加按钮的容器。