2010-03-11 17 views
2

我原來的理解是,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

回答

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,則會發生這種情況。

+0

不僅如此,但其他的控制活動,如負載,也可以這麼火控制可以「追趕」到控制樹的其餘部分是在生命週期。 – 2010-03-11 21:35:09

+0

@威廉 - 好點,找到一張圖片來說明你在寫評論的過程中:) – 2010-03-11 21:35:48

+0

正確的,每個控件在連接後都會在生命週期中追上新父母的當前狀態。每個控制具有專用變量_controlState跟蹤這樣的:在反射鏡 代碼: 保護的內部虛擬無效AddedControl在(控制控制,INT指數) ... 如果(this._controlState> = ControlState.ChildrenInitialized) { control.InitRecursive (namingContainer); ... – Xerion 2010-03-15 15:03:58