何时连接事件处理程序asp.net
假设我们有一个非常标准的forms,带有文本框和按钮(为简单起见)。 您想要处理Click事件并根据用户的输入执行一些操作。
我想知道,重要的是,当您在代码隐藏中为Click事件连接一个事件处理程序时? 如果是的话,放在哪里的最佳位置? 页面加载? 页面初始化? 我已经尝试了两个地方,但没有发现任何差异。 或者这只是程序员的个人偏好? 我已经在互联网上搜索了几次,但没有找到任何满意的答案。
我知道当实际方法执行时,只是不确定接线部分 。
如您所知,有几个Page_xxx
事件处理程序,如Init
, Load
, Prerender
……这些事件存在于Controls,Pages和User控件中(实际上它们是从Control
派生的,它包含所有这些事件)。
此事件与ASP.NET页面生命周期有关
如果您仔细阅读此链接指向的页面,您将了解何时触发事件。 因此,如果您在触发事件之前发生的任何页面生命周期事件中绑定事件处理程序,则可以保证您的事件处理程序将被及时绑定以被触发。
这些是主要的生命周期步骤:
PreInit -> Init -> InitComplete -> PreLoad -> Load -> [Control events] -> LoadComplete -> PreRender -> SaveStateComplete -> Render -> Unload
并非所有事件都有相关事件,但是,如果有必要,您可以覆盖相应的OnXxx()
函数,如OnPreInit()
。 (这通常仅在自定义服务器控件上完成)。
您可以在Page_Init
或Page_Load
绑定事件,因为在加载所有控件完成后触发控件事件 。 “ Load
步骤以自上而下的方式发生,首先在页面中,然后在所有子控件中递归。
Load
完成后,触发的第一个事件是Change Events,如TextChanged
或SelectionChanged
。 然后触发所有其他事件,如Click
。
如果您在PreRender或Unload中绑定事件,则不会触发它们。 如果你在Init或Load中做过,他们会 。
所以看起来在Init或Load中绑定是安全的,但事实并非如此 :
看起来没有特别的理由在Init
或Load
上绑定它们,因为它们将在页面生命周期的后期触发。 但是,由于.aspx
定义的绑定发生在Init
期间,程序员将期望所有事件都已绑定在Load
事件中。 如果这个程序员在代码中引发了一个子控件事件,会发生什么? Load
事件首先在控制树的根中发生,并且在递归上发生在所有子节点上。 因此,当程序员尝试引发子控件的事件时,它将不会受到约束。 所以这不会按预期工作。 这足以考虑在Load
事件中绑定事件的不安全性。 这就是你应该始终在Init
绑定事件的原因。
查看此图以查看Page&children事件的执行顺序: ASP.NET页面生命周期图
我一直在控制标签中连接我的。 如果我这样做,很明显存在事件处理程序。
如果我必须在代码隐藏中连接一个事件处理程序,我会把它作为私有函数调用放在Page_Load中。