2009-10-30 102 views
9

Web部件生命周期described这样的:为什么在回发时OnLoad/CreateChildControls顺序发生变化?

在页面加载

  1. 构造
  2. 的OnInit
  3. 的OnLoad
  4. ConnectionConsumer方法被调用,如果Web部件连接
  5. CreateChildControls ...

1日回发(回传点击 处理程序将通过公共 属性ViewState)

  1. 构造
  2. 的OnInit
  3. 的CreateChildControls
  4. 的OnLoad
  5. 回传点击处理...

月2回传(回传点击 处理程序将通过公共 属性ViewState)

  1. 构造
  2. 的OnInit
  3. LoadViewState
  4. 的CreateChildControls
  5. 的OnLoad ...

就像你c看到OnLoad和CreateChildControls改变它们的顺序。这在我的代码中引入了一些困难,因为我需要收集我以前在OnLoad元素中执行的各种数据。

是否有任何理由为什么订单在回发阶段发生变化?

回答

14

只要框架(或您自己)调用EnsureChildControls方法,就会调用CreateChildControls。只要你需要子控件在那里,就应该调用这个方法。

在框架的情况下,它希望设置OnInit和OnLoad之间的发布值(以便您可以在OnLoad期间访问这些值)。因为它需要控件来执行此操作,它会为您调用EnsureChildControls。

如果没有回发,也不需要设置值,因此对EnsureChildControls的调用将等待,直到框架确实需要控件。这恰好在OnLoad和OnPreRender之间。

+0

这是一个很好的答案。 – spa 2009-12-09 10:00:44

-4

这不应该发生,你确定吗?有没有其他线程运行,可能会使它看起来好像命令已经改变?

这毕竟只是ASP.NET,一个由计算机执行的程序(意思是它应该总是做同样的事情,不像一个人)。

+0

是的我确定...--( – spa 2009-10-30 08:17:24

+0

这不是我自己想出来的东西,它在各种博客文章中都有描述(请参阅问题中的链接),我使用调试器对其进行了验证 – spa 2009-10-30 08:23:01

相关问题