在我的ASP.NET应用程序中,我在母版页中有一个控件,可以在某些场合/交互中引发事件Foo
。
我还有一些页面有另一个控件,在触发此事件时必须重新绑定它。
不幸的是,我看到他们彼此之间进行通信的唯一方法是创建一个长事件链(派生一个新的MasterPage MasterPageSuperDuper
,在用户控件中将事件处理程序附加到Foo
的事件,然后在几页中的控件中引用主页中的这个事件 - 基本上使用母版页作为控制中心。
是否可以在不涉及母版页的情况下引发页面控件可以看到的事件?
答案 0 :(得分:1)
我们走了。
创建一个接口,放入app_code文件夹
public interface IBinder
{
void Bind();
}
PageControl实施界面
public partial class WebUserControl2 : System.Web.UI.UserControl, IBinder
{
protected void Page_Load(object sender, EventArgs e)
{
}
public void Bind()
{
}
}
在主页上的控制中
public partial class WebUserControl1 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void butRaiseEvent_Click(object sender, EventArgs e)
{
CheckSub(this.Parent.Parent.Controls);
}
private void CheckSub(ControlCollection cc)
{
foreach (Control c in cc)
{
if (c is IBinder)
((IBinder)c).Bind();
else
CheckSub(c.Controls);
}
}
}
让我知道它是否有效。
答案 1 :(得分:0)
页面上的控件不知道其他“孩子”是谁,所以你不能自动让他们说“看,这个页面上有另一个控件。你怎么做其他控制?”没有做一些工作,通常是通过父容器。
您可以使用一些机制来解决问题,但您仍然必须通过常见的“容器”(例如页面或母版页)来获取事件。
我很好奇为什么你在母版页中提出需要在子级别进行如此复杂控制的事件。我想有一个更优雅的架构解决方案。