什么时候连接事件处理程序asp.net

时间:2012-04-17 23:10:35

标签: c# asp.net event-handling

假设我们有一个非常标准的形式,带有文本框和按钮(为简单起见)。您想要处理Click事件并根据用户的输入做一些事情。

我很想知道,当你在代码隐藏中为Click事件连接一个事件处理程序时,它是否重要?如果是的话,放在哪里的最佳位置?页面加载?页面初始化?我已经尝试了两个地方,但没有发现任何差异。或者这只是程序员的个人偏好?我已经在互联网上搜索了几次,但没有找到任何满意的答案。

我知道当实际方法执行时,只是不确定布线部分

2 个答案:

答案 0 :(得分:15)

如您所知,有几个Page_xxx事件处理程序,例如InitLoadPrerender ...此事件存在于Controls,Pages以及用户控件(实际上它们是从Control派生的,它包含所有这些事件。)

此事件与ASP.NET Page Life Cycle

相关

如果您仔细阅读此链接指向的页面,您将了解触发事件的时间。因此,如果您在触发事件之前发生的任何页面生命周期事件中绑定事件处理程序,则可以保证您的事件处理程序将被及时绑定以进行触发。

这些是主要的生命周期步骤:

PreInit -> Init -> InitComplete -> PreLoad -> Load -> [Control events] ->
LoadComplete -> PreRender -> SaveStateComplete -> Render -> Unload

并非所有事件都有相关事件,但是,如果有必要,您可以覆盖相应的OnXxx()函数,例如OnPreInit()。 (这通常仅在自定义服务器控件上完成。)

您可以绑定Page_InitPage_Load中的事件,因为控制事件在所有控件加载完成后触发Load步骤以自上而下的方式发生,首先在Page中,然后在所有子控件中递归。

Load完成后,触发的第一个事件是更改事件,例如TextChangedSelectionChanged。然后触发所有其他事件,例如Click

如果您在PreRender或Unload中绑定事件,则不会触发它们。如果你在Init或Load中做过,他们会

所以看起来在Init或Load中绑定是安全的,但那不是真的

看起来似乎没有特别的理由在InitLoad上绑定它们,因为它们将在页面生命周期的后期触发。但是,由于.aspx中定义的绑定发生在Init期间,程序员将期望所有事件都已绑定在Load事件中。如果这个程序员在代码中引发了一个子控件事件,会发生什么? Load事件首先在控制树的根中发生,并且在递归上发生在所有子节点上。因此,当程序员尝试引发子控件的事件时,它将不会被绑定。所以这不会按预期工作。这足以考虑在Load事件中绑定事件的不安全性。这就是为什么你应该始终绑定Init 中的事件。

查看此图表以查看Page&amp ;;的执行顺序。儿童活动: ASP.NET Page Life Cycle Diagram

答案 1 :(得分:1)

我一直在控制标签中连接我的。如果我这样做,很明显存在一个事件处理程序。

<asp:Button ID="btnRefresh" runat="server" Text="Refresh" OnClick="btnRefresh_Click" />

如果我必须在代码隐藏中连接一个事件处理程序,我会把它作为私有函数调用放在Page_Load中。