ASP.net动态创建的控件事件处理
实际上,我在页面加载时动态地将占位符添加到页面中 然后,我有一个复合控件,它被添加到占位符中,并在运行时为特定页面事件显示。复合控件有一个按钮。我在复合控件中为按钮提供了一个公共eventhandler,但实际上在页面代码中没有直接访问此eventhandler的权限 要显示控件,我将进行以下调用,例如:ASP.net动态创建的控件事件处理,asp.net,user-controls,composite,event-handling,Asp.net,User Controls,Composite,Event Handling,实际上,我在页面加载时动态地将占位符添加到页面中 然后,我有一个复合控件,它被添加到占位符中,并在运行时为特定页面事件显示。复合控件有一个按钮。我在复合控件中为按钮提供了一个公共eventhandler,但实际上在页面代码中没有直接访问此eventhandler的权限 要显示控件,我将进行以下调用,例如: MyControl.Create(args, new EventHandler(OnClick)); 然后在页面上,我将有protectedvoidonclick(objecto,Even
MyControl.Create(args, new EventHandler(OnClick));
然后在页面上,我将有protectedvoidonclick(objecto,EventArgs args){}
当然,当我调用create()
时,我会将eventhandler连接到复合控件的按钮单击事件。到现在为止,一直都还不错。连接按钮后,按钮单击将按预期发回控件。但是,事件永远不会返回到页面的事件处理程序
我意识到问题发生在回发上。然而,尝试在init、load或createchildcontrols上连接按钮都无法保持连接,因此事件可以在页面上处理。我想要的是,能够在运行时将eventhandler传递给复合控件,并且复合控件能够在回发时正确地将事件发送回页面
有趣的是,如果我使用自定义eventargs调用OnBubble,我可以在页面上捕获冒泡事件。但问题是我的占位符在页面上,因此当我尝试调用UserControl中的MyControl.Create()
时,冒泡会转到页面而不是UserControl(如预期的那样)。因此,我更喜欢声明eventhandler而不是重写OnBubble
(UserControls和其他声明MyControl的控件基本上会使它对按钮单击事件毫无用处)
我希望有人能对这个问题有所了解。这似乎是一个有趣的问题,但除了在页面上显式声明控件,并在标记或pageload中直接连接事件之外,可能没有其他解决方案。我会考虑让按钮做异步回调,但是如果可能的话,更喜欢使用标准的ASP.NET事件处理。p>
谢谢
添加说明:MyControl.Create()
调用实际上生成了一个调用复合控件的Create()
方法的事件。这一切都很好,但值得注意的是,MyControl.Create()
方法不能直接访问该控件。这应该是有意义的,因为控件已添加到非in标记上的页面onload
更多代码:
MyControl : CompositeControl
{
public event EventHandler Click;
//I have a create method
void Create(args, EventHandler click)
{
this.Click = click;
//other processing
}
//then the button is wired up. I've tried in OnInit(), OnLoad()
void CreateChildControls()
{
MyButton.OnClick += Click;
}
//if I wire up the button to a default handler I can check if
Click is not null and send the click event onto the next handler
//this is where the bubble event works, but the wiring fails
}
编辑:我尝试在会话中存储eventhandler并在回发时连接按钮,但成功。我不认为这是一个好的做法,我认为这不符合我的目的。例如,在本例中,页面上的事件按预期执行,但具有非标准页面行为。例如,Response.Redirect()抛出异常。这应该是有意义的,因为eventhandler可能在回发过程中丢失了状态信息。
有几点想法:
1.我是否可以创建一个与此控件相关的自定义气泡事件?这似乎是有道理的,但页面回发的问题再次给我留下了相同的问题,即泡沫应该去哪里。那么,当我调用create()时,是否可以自动将UserControl注册为冒泡的目标?这似乎很难。
2.页面生命周期中是否有某个点可以在UserControl声明的eventhandler上重新连接事件,以便在回发时正确调用委托?这似乎是我所缺少的。eventhandler是在回发时创建的,但由于OnClick期间未在UserControl中重新创建而丢失。我不希望UserControl必须显式地重新创建对象,而是希望子控件为UserControl重新创建它。这听起来像是一个简单的请求,但由于UserControl不在循环中,我可能在请求不可能的结果 将控件动态插入占位符的动机是什么?请求之间实际上不存在页面,因此任何动态插入的控件都无法生存。你基本上得假装一下
您可能要考虑的一个选项是编写自定义控件,该控件具有不同的呈现模式,但具有一致的事件接口。另一种方法是使用ASP.NET多视图控件,该控件仅在HTML中呈现可见视图,但仍在不可见视图中维护事件处理程序。
将控件动态插入占位符的动机是什么?请求之间实际上不存在页面,因此任何动态插入的控件都无法生存。你基本上得假装一下您可能要考虑的一个选项是编写自定义控件,该控件具有不同的呈现模式,但具有一致的事件接口。另一种方法是使用ASP.NET多视图控件,它只在HTML中呈现可见视图,但仍在不可见视图中维护事件处理程序。
好的,如果我错了,请纠正我,Create()方法实际上实例化了内部控件并将其设置为已知状态;我看到您已经有了对按钮的引用,那么为什么此时需要额外的单击事件呢 当您调用Create()时,您将初始化控件及其按钮,然后,当您知道按钮在那里时,连接您的事件处理程序,传递您在那里得到的参数MyControl : CompositeControl
{
void Create(args, EventHandler click)
{
// init & set up your control
// other processing
MyButton.OnClick += click;
}
}
好的,如果我错了,请纠正我,您的Create()方法实际上实例化并将您的内部控件设置为已知状态;我看到您已经有了对按钮的引用,那么为什么此时需要额外的单击事件呢 当您调用Create()时,您将初始化控件及其按钮,然后,当您知道按钮在那里时,连接事件处理程序p