控件的OnInit是否在父母的OnPreRender中附加时被调用?

时间:2010-03-11 21:27:27

标签: asp.net

我最初的理解是,在正常情况下,asp.net页面生命周期对所有页面和控件运行一次。当我在容器的OnPreRender中附加一个控件时,我遇到了一个没有调用控件的OnInit的情况。好的,我认为我的代码中存在一个错误并通过先附加控件来修复。

但就在今天,我遇到了一个情况,即在为其他人完成正常的OnInit后,似乎会调用OnInit控件。见下面的堆栈。似乎在页面的PreRender期间,控件的OnInit在动态添加时被调用。

所以我只是想确切知道ASP.NET的行为是什么?它是否真正跟踪每个控件生命周期的阶段,并且在添加新控件后,它将从一开始就运行?

[HttpException(0x80004005):在DataBind,Init,Load,PreRender或Unload阶段无法修改控件集合。    System.Web.UI.ControlCollection.Add(Control child)+8678663    MyCompany.Web.Controls.SetStartPageWrapper.Initialize()    MyCompany.Web.Controls.SetStartPageWrapper.OnInit(EventArgs e)    System.Web.UI.Control.InitRecursive(Control namingContainer)+333    System.Web.UI.Control.InitRecursive(Control namingContainer)+210    System.Web.UI.Control.AddedControl(控件控件,Int32索引)+198    System.Web.UI.ControlCollection.Add(Control child)+80    MyCompany.Web.Controls.PageHeader.OnPreRender(EventArgs e)in    System.Web.UI.Control.PreRenderRecursiveInternal()+ 80    System.Web.UI.Control.PreRenderRecursiveInternal()+171    System.Web.UI.Control.PreRenderRecursiveInternal()+171    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+842

1 个答案:

答案 0 :(得分:4)

一旦控件的OnInit被添加到控件树中,就会调用它。在你的堆栈中你可以看到这种情况发生,这种情况发生了:

System.Web.UI.Control.AddedControl(Control control, Int32 index) +198   
System.Web.UI.ControlCollection.Add(Control child) +80 

然后触发:

MyCompany.Web.Controls.SetStartPageWrapper.OnInit(EventArgs e) 

因此,无论在生命周期中添加什么点,OnInit都会启动。

Egghead has a good image depicting normal event lifecycles between pages and controls,但请记住,如果事件尚不存在,某些事情就无法执行...如果它刚刚添加,它必须在那时赶上事件而不是如果控件处于标记或CreateChildControls,则会发生这种情况。