我最初的理解是,在正常情况下,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
答案 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
,则会发生这种情况。