C# 母版页中的事件处理程序访问客户端页中的控件

C# 母版页中的事件处理程序访问客户端页中的控件,c#,asp.net,webforms,event-handling,C#,Asp.net,Webforms,Event Handling,我在母版页上有一个按钮,单击该按钮时,会调用一个方法,该方法接受以前保存到viewstate的EventHandler,该方法位于客户端页上,并执行它: protected void Save_Click(object sender, EventArgs e) { this.SaveButtonEvent += (EventHandler)ViewState["saveEvent"]; if (this.SaveButtonEvent != null)

我在母版页上有一个按钮,单击该按钮时,会调用一个方法,该方法接受以前保存到viewstate的EventHandler,该方法位于客户端页上,并执行它:

 protected void Save_Click(object sender, EventArgs e)
    {

        this.SaveButtonEvent += (EventHandler)ViewState["saveEvent"];
        if (this.SaveButtonEvent != null)
        {
            this.SaveButtonEvent(sender, e);

        }

    }
然后在客户端页面上调用一个非常简单的方法:

protected void Button2_Click(object sender, EventArgs e)
{

    Label1.Text = TextBox2.Text;
}
但是,TextBox2的值不正确,它是加载页面时设置的文本框的值(或者如果页面上的任何其他项目更改了它),则不会传递新值

如果我向客户端页面添加一个按钮,它直接调用Button2\u Click事件,那么它就是正确的值

是因为从母版页调用了事件,所以无法获取文本框的正确值的原因吗?有什么解决办法吗


我应该补充一点,这个按钮是动态创建的,事件委托会有所不同,这就是为什么我必须在运行时设置它。我需要一种方法在单击时设置代理,并将其保持到再次更改为止。

否,原因是您已将代理保存在viewstate中


当您检索委托时,它仍然引用创建委托的页面中的控件,因此您将使用不再存在的页面对象中的控件。

您是否可以从母版页中公开可以在内容页中处理的事件

母版页:

public event EventHandler<EventArgs> AfterSave;
protected void Save_Click(object sender, EventArgs e)
{
    if(AfterSave != null) AfterSave(this, EventArgs.Empty);
}

--Pavel

啊,这是有道理的(尽管我也尝试过在会话中保存它,结果相同),你能建议我在回发之间存储它吗?@Sam:回发之间不能存储控制对象,它们必须为将要使用它们的页面对象创建。即使可以,它也没有用,因为它不是当前页面中的控件,所以更改它们不会产生明显的效果。您必须访问当前页面对象中的控件。将
页面
引用转换为实际的页面类,以便您可以访问它的成员,例如:
((客户端页面)页面).Label1.Text
。谢谢,我最后做了一些非常类似的事情,并在正确的时间获得了事件处理程序。
protected void Page_Load(object sender, EventArgs e)
{
    MasterPageObject m = (MasterPageObject)base.Master;
    m.AfterSave += onMasterSave;
}
private void onMasterSave(object sender, EventArgs e)
{
    // Your processing here
}