我非常确定在 ASP.NET 1.0/1.1 时代,需要在运行时创建的控件之前添加Page_Load
事件的页面生命周期(即里面Page_Init
).
这是 Microsoft 的一篇文章(针对 .NET 1.0/1.1):
如何:在 ASP.NET 中动态创建控件:
注意 创建动态控件时
在 Web 表单上,您必须创建
控件并将它们添加到控件中
Page_Init 中的集合
事件处理程序或 Page_Load 事件
处理程序。否则,控件可能会
行为不符合预期。
然而,在这里的一些帖子中,似乎上述情况不再是这样了。添加的控件Page_Load
似乎正在为其他人工作。一些帖子包括:
在 ASP.NET 中创建动态控件
Viewstate - 完全混乱。
我自己尝试过,确实有效,尽管我没有做足够的测试来找出任何意外的行为。
So is Page_Load
添加动态控件的安全阶段?或者仅适用于.NET 2.0 及更高版本?
我已经用 Reflector 研究过这个问题,当您动态添加它们时,Control 类确实可以加快速度,无论您何时添加它们。它执行所有操作 - 加载视图状态/控制状态、调用回发事件、调用事件处理程序等。我不知道在 ASP.NET 1.x 时代是否有所不同,但在 2.0 及更高版本中就是这种情况。
至于“危险” - 有一些陷阱,没有经验的用户可能会绊倒,因此建议您将它们添加到 Page_Init 或之前。 (请注意,PreInit 事件仅适用于页面本身,不适用于母版页或子控件)。从我的脑海中浮现出来(我确信可能还有更多):
- 默认情况下,视图状态按位置加载。也就是说,它会忽略控件 ID,而在加载视图状态时仅考虑控件在树中的位置。如果动态控件在视图状态序列化时存在,但在反序列化时不存在,则错误的视图状态项可能会分配给错误的控件,从而导致异常。这可以通过某些设置来更改,尽管我现在懒得搜索它们。
- 由于“加快速度”是在将动态控件添加到页面时发生的,因此某些事件的顺序可能是意外的。例如,如果在 Page_PreRender 事件中向页面添加一个 TextBox 控件,则该 TextBox 的 Changed 事件就会立即发生。如果您的事件处理程序代码依赖于 PreRender 之前其余部分发生的事件,那么您就完蛋了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)