我构建了一个ascx控件,它是我应用程序的许多不同组件的一部分。此控件上有一个Previous和Next按钮,应该向父aspx页面发出信号。这是通过让父页面为回发添加一些代表来完成的,例如OnPreviousClicked,OnNextClicked等。
此应用中的所有内容均为“ajaxified”,并带有更新面板。现在我注意到如果我没有在父级中的每一个Page_Load调用上设置委托,我的应用程序就会中断。换句话说,如果我不总是在父aspx的Page_Load中设置委托,那么ascx会以null委托和异常结束。我能正确编码吗?
答案 0 :(得分:2)
如果您所做的只是发出点击按钮的信号,我会让您的ASCX控件发起一个简单的事件。这样,每个页面都可以在需要时监听事件,并且无论是否有人在监听,控件都可以正常运行。
首先在ASCX代码隐藏中声明事件:
public event System.EventHandler NextSelected;
然后,您可以创建引发事件的按钮单击事件。
protected void btnNextSelected_Click(object sender, EventArgs e)
{
if (EmployeeSelected != null)
{
NextSelected(this, new EventArgs());
}
}
然后在您的父ASP.Net页面中,您可以添加ASCX控件(我们称之为NavControl)并创建侦听这些事件的方法。
NavControl.NextSelected += new EventHandler(NextPageRedirect);
protected void NextPageRedirect(object sender, EventArgs e)
{
Response.Redirect("~/ViewEmployee.aspx", false);
}
请注意,使用此功能,您无需创建事件处理程序或方法,仍可以在页面上使用导航控件。它还应该消除你与代表们的问题。
答案 1 :(得分:2)
//在控件内
public event EventHandler OnPreviousClicked;
private void PreviousButton_OnClick(object sender, EventArgs e)
{
if(OnPreviousClicked != null) {
OnPreviousClicked(this, e); // or whatever args you want
}
}
//并在页面代码隐藏
内private void Page_Load(...)
{
MyUserControl.OnPreviousClicked += new EventHandler(myHandler);
}
//在页面aspx中,您也可以设置OnPreviousClicked
属性。
<xx:MyUserControl ID="MyUserControl1" runat="server" OnPreviousClicked="myHandler" />
答案 2 :(得分:1)
记住每个回发都必须重新启动你的代码。事件处理程序不会被序列化到viewstate,因此您必须重新设置它们。
答案 3 :(得分:1)
这是asp.net中的预期行为。
即使是部分回发(更新面板),也会发生整个page life cycle。因此,为了触发事件,您必须在page_load期间以编程方式连接它们或在标记中以声明方式连接它们(如果您提到的那些代理是事件)。