我原來的理解是,asp.net頁面生命週期是爲正常情況下的所有頁面和控件運行一次。當我在容器的OnPreRender中附加一個控件時,我遇到了未調用控件的OnInit的情況。好的,我認爲這是我的代碼中的一個錯誤,並且通過更早地附加控件來解決這個問題。是父母的OnPreRender在安裝時,它控制的OnInit的叫什?
不過就在今天,我遇到了在那裏的OnInit的控制似乎正常的OnInit已經爲其他人做過之後調用的情況。見下面的堆棧。看起來,在頁面的PreRender中,控件的OnInit在被動態添加時被調用。
所以,我只是想確認一下ASP.NET的行爲到底是什麼?其實是否跟蹤每個控件的生命週期階段,而在添加了新的控制,它會從一開始就運行?
[HttpException(0X80004005):控制收集不能期間的DataBind,初始化,裝載,在PreRender被修改或卸載階段] System.Web.UI.ControlCollection.Add(控制子)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(Control control,Int32 index)+198 System.Web.UI.ControlCollection.Add(Control child)+80 MyCompany.Web.Controls.PageHeader.OnPreRender(EventArgs Ë )在 System.Web.UI.Control.PreRenderRecursiveInternal()80 System.Web.UI.Control.PreRenderRecursiveInternal()171 System.Web.UI.Control.PreRenderRecursiveInternal()171 的System.Web.UI .Page.ProcessRequestMain(布爾includeStagesBeforeAsyncPoint,布爾includeStagesAfterAsyncPoint)842
不僅如此,但其他的控制活動,如負載,也可以這麼火控制可以「追趕」到控制樹的其餘部分是在生命週期。 – 2010-03-11 21:35:09
@威廉 - 好點,找到一張圖片來說明你在寫評論的過程中:) – 2010-03-11 21:35:48
正確的,每個控件在連接後都會在生命週期中追上新父母的當前狀態。每個控制具有專用變量_controlState跟蹤這樣的:在反射鏡 代碼: 保護的內部虛擬無效AddedControl在(控制控制,INT指數) ... 如果(this._controlState> = ControlState.ChildrenInitialized) { control.InitRecursive (namingContainer); ... – Xerion 2010-03-15 15:03:58