在Load事件中使用LoadControl的缺陷

Jak*_*art 5 asp.net

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

当您将控件加载到容器控件中时,容器会引发所有添加的控件的事件,直到它赶上当前事件.但是,添加的控件无法跟上回发数据处理.对于参与回发数据处理(包括验证)的附加控件,必须在Init事件中而不是在Load事件中添加控件.

它究竟意味着什么?

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

Mic*_*Liu 4

MSDN 文档中的那部分内容(大部分)是错误的。正如您所发现的,即使您在事件中动态添加控件,回发数据处理和验证也能正常工作Load

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

  1. 引发Init事件。
  2. 回发:加载视图状态和控制状态。
  3. 回发:加载已发布的表单数据(第一次尝试)。
  4. 引发Load事件。
  5. 回发:加载已发布的表单数据(第二次尝试)。
  6. 回发:验证表单并引发回发事件。

当文档说“添加的控件没有赶上回发数据处理”时,它是正确的。但它忽略了这样一个事实:有两次尝试加载已发布的表单数据,一次在Load事件之前,一次在事件之后。因此,如果您在事件中动态添加控件Load,则在回发事件(例如 )发生时,submitButton_Click用已发布的表单数据填充该控件。

据我所知,主要区别和潜在陷阱如下:

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