在Load事件中使用LoadControl的缺陷

时间:2012-02-29 22:34:41

标签: asp.net

我在Load事件中使用LoadControl方法相当广泛。但是我还没有发现任何问题,我担心MSDN documentation说的是什么:

  

将控件加载到容器控件中时,容器   提出所有添加的控件的事件,直到它赶上了   当前事件。但是,添加的控件无法赶上   回发数据处理。为了增加控制参与   回发数据处理,包括验证,控制必须   添加在Init事件中而不是Load事件中。

它究竟意味着什么?

在Load事件中加载控件时是否还有其他陷阱?

2 个答案:

答案 0 :(得分:4)

那些MSDN文档(大多数)是错误的。正如您所发现的,即使您在Load事件中动态添加控件,回发数据处理和验证仍然有效。

以下是与此问题相关的ASP.NET页面生命周期的各个阶段:

  1. 举起Init活动。
  2. 回发:加载视图状态和控件状态。
  3. 回发:加载发布的表单数据(首次尝试)。
  4. 举起Load活动。
  5. 回发:加载发布的表单数据(第二次尝试)。
  6. 回发:验证表单并引发回发事件。
  7. 当文档说“添加的控件无法跟上回发数据处理”时,文档是正确的。但它忽略了这样一个事实:两次尝试加载发布的表单数据,一次是在Load事件之前,一次是在Load事件之后。因此,如果您在submitButton_Click事件中动态添加控件,则在回发事件(例如Init)发生时,填充已发布的表单数据。< / p>

    据我所知,这是主要的区别和潜在的陷阱:

    • 如果您在Load中动态添加控件,则可以在Load中访问其发布的表单数据。
    • 如果您在HttpRequest.Form中动态添加控件,则必须等到回发事件(或者直接访问{{1}}集合)。

答案 1 :(得分:1)

这意味着在执行Control_Load时,回发周期已经过去了。如果你有一个需要参与回发的控件,你需要先加载它,这就是为什么文档建议改为使用Init覆盖它。

如果您的控件没有参与回发,那么您就可以了。