6

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

我想知道,当您在代码隐藏中为 Click 事件连接事件处理程序时,这有关系吗?如果是这样,最好的放置位置在哪里?页面加载?页面初始化?这两个地方我都试过了,但没有发现任何区别。还是只是程序员的个人喜好?我已经在互联网上搜索了几次,但没有找到任何满意的答案。

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

4

2 回答 2

15

如您所知,有几个Page_xxx事件处理程序,如Init, Load, Prerender... 这些事件存在于 Controls 和 Pages 以及 User 控件中(实际上它们是派生的 form Control,它包含所有这些事件)。

此事件与ASP.NET 页面生命周期有关

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

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

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

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

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

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

如果您在 PreRender 或 Unload 中绑定事件,它们将不会被触发。如果您在 Init 或 Load 中执行此操作,它们会.

所以看起来在 Init 或 Load 中绑定是安全的,但事实并非如此

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

看这张图可以看到Page & children事件的执行顺序: ASP.NET Page Life Cycle Diagram

于 2012-04-17T23:51:41.877 回答
0

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

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

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

于 2012-04-17T23:19:05.963 回答