ASP.NET頁面的執行順序 -轉

來源:互聯網
上載者:User
Page calls Construct Page finishes Construct Page calls New Page finishes New Page calls DeterminePostBackMode Page finishes DeterminePostBackMode Page calls AddParsedSubObject Page calls CreateControlCollection Page finishes CreateControlCollection Page calls AddedControl Page finishes AddedControl Page finishes AddParsedSubObjectChildControl calls ConstructChildControl finishes ConstructChildControl calls NewChildControl finishes New* -- Page parses templated properties here and calls Set for those properties on the ChildControl (e.g., <tag:namespace id=”idName” runat=”server” FirstName=”Adam” LastName=”Wayne” DisplayBothNames=”True” />) Page calls AddParsedSubObject Page calls AddedControl Page finishes AddedControl Page finishes AddParsedSubObject Page calls AddParsedSubObject Page calls AddedControl Page finishes AddedControl Page finishes AddParsedSubObjectChildControl calls OnInitChildControl raises InitChildControl finishes OnInitChildControl calls TrackViewStateChildControl finishes TrackViewState Page calls OnInit Page raises Init Page finishes OnInit Page calls TrackViewState Page finishes TrackViewState Page calls OnLoad Page raises Load Page finishes OnLoadChildControl calls OnLoadChildControl raises LoadChildControl finishes OnLoad Page calls EnsureChildControls Page calls CreateChildControls Page finishes CreateChildControls Page finishes EnsureChildControls Page calls OnPreRender Page raises PreRender Page finishes OnPreRenderChildControl calls EnsureChildControlsChildControl calls CreateChildControlsChildControl finishes CreateChildControlsChildControl finishes EnsureChildControlsChildControl calls OnPreRenderChildControl raises PreRenderChildControl finishes OnPreRender Page calls SaveViewState Page finishes SaveViewStateChildControl calls SaveViewStateChildControl finishes SaveViewState Page calls SavePageStateToPersistenceMedium Page finishes SavePageStateToPersistenceMedium Page calls CreateHtmlTextWriter Page finishes CreateHtmlTextWriter Page calls Render Page finishes RenderChildrenChildControl calls RenderChildControl calls RenderChildrenChildControl finishes RenderChildrenChildControl finishes Render Page finishes RenderChildren Page finishes RenderChildControl calls OnUnloadChildControl raises UnloadChildControl finishes OnUnload Page calls OnUnload Page raises Unload

Page finishes OnUnload

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

在WebForm1頁面上直接放置使用者控制項WebUserControl1時的事件順序: WebUserControl1_Init
WebForm1_Init
Page_Load
WebUserControl1_Load
WebForm1_PreRender
WebUserControl1_PreRender
WebUserControl1_Unload
WebForm1_Unload
在WebForm1頁面的OnInit方法中用代碼Load使用者控制項WebUserControl1時的事件順序: WebForm1_Init : OnInit WebForm1: Loading controls WebUserControl1_Init : OnInit WebForm1: added to Controls WebForm1: LoadViewState WebUserControl1: LoadViewState WebUserControl1: LoadPostData Begin WebUserControl1: LoadPostData End WebForm1_PageLoad: OnLoad after base's Onload. WebUserControl1_Load: after base's OnLoad iWebUserControl1: RaisePostDataChange WebForm1: OnPreRender WebUserControl1: OnPreRender WebForm1: SavedViewState WebUserControl1: SaveViewState 在WebForm1頁面的Page_Load方法中用代碼Load使用者控制項WebUserControl1時的事件順序: WebForm1_Init : OnInit WebForm1: LoadViewState WebForm1_PageLoad: OnLoad after base's Onload. WebForm1: Loading controls WebUserControl1_Init : OnInit WebUserControl1: LoadViewState WebForm1: added to Controls WebUserControl1_Load: after base's OnLoad WebUserControl1: LoadPostData Begin WebUserControl1: LoadPostData End iWebUserControl1: RaisePostDataChange WebForm1: OnPreRender WebUserControl1: OnPreRender WebForm1: SavedViewState WebUserControl1: SaveViewState 在WebForm1頁面的Button1_Click事件中用代碼Load使用者控制項WebUserControl1時的事件順序: WebForm1_Init
Page_Load
Button1_Click
WebUserControl1_Init
WebUserControl1_Load
WebForm1_PreRender
WebUserControl1_PreRender
WebUserControl1_Unload
WebForm1_Unload
在WebForm1頁面的Page_Load事件中用代碼Load使用者控制項WebUserControl1,WebUserControl1又在Page_Load事件中用代碼Load使用者控制項WebUserControl2時的事件順序: WebForm1_Init
Page_Load
WebUserControl1_Init
WebUserControl1_Load
WebUserControl2_Init
WebUserControl2_Load
WebForm1_PreRender
WebUserControl1_PreRender
WebUserControl2_PreRender
WebUserControl2_Unload
WebUserControl1_Unload
WebForm1_Unload

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ProcessRequest方法執行過程:
  頁面事件
  可重定義的方法
  頁面初始化(Init,當Init事件發生時,代表所有在.aspx檔案中靜態聲明的控制項被執行個體化
                         並被賦予了預設值,在Init事件中可以初始化任何的在頁面生命週期裡需要的設定,
                         需要注意的是,任何的檢視狀態資訊在這個階段裡是不能用的)
  檢視狀態載入(LoadViewState,__VIEWSTATE是 名稱/值 對的集合,
                          象LoadPageStateFormPersistenceMedium這樣的方法和與其相對應的  
                          SavePageStateToPersistenceMedium 方法可以用來載入或者儲存檢視狀態
                          到其他的儲存中介裡,和LoadViewState方法不相同的是,上面提到的方法
                          只能在Page的繼承類裡使用)
  回傳資料處理(控制項裡實現了IPostBackDataHandler介面的LoadPostData方法 )
  頁面載入 (Load)
  回傳資料變化檢查(控制項裡實現了IPostBackDataHandler介面的RaisePostDataChangedEvent方法) 
  回傳事件處理(控制項裡定義的回傳事件.控制項裡實現了IPostBackEventHandler介面的RaisePostBackEvent方法)
  頁面預返回階段(PreRender,SaveViewState)
  頁面返回階段(Render)
  頁面卸載階段(Unload)

ProcessRequest方法最先調用的是其所在類(Page)重載實現的基類System.Web.WebControls.TemplateControl的"FrameworkInitialize”虛擬方法,頁面的控制項樹就在這個時候產生。 asp.net 生命週期中的時間流程

一、初始化

  ·當頁面被提交請求第一個方法永遠是建構函式。您可以在建構函式裡面初始一些自訂屬性或對象,不過這時候因為頁面還沒有被完全初始化所以多少會有些限制。特別地,您需要使用HttpContext對象。當前可以使用的對象包括QueryString, Form以及Cookies集合,還有Cache對象。注意:在建構函式裡是不允許使用Session的。

  ·下一個將執行的方法是AddParsedSubObject方法,這個方法將添加所有獨立的控制項並把頁面組成一個控制項集合樹,這個方法經常被一些進階的頁面模板解決方案(Page Template Solutions)重寫以便添加頁面內容到頁面模板(Page Template)中一些特殊的控制項中。這個方法遞迴應用到所有的頁面控制項及相應的的每個子控制項,所有的控制項都是在這個方法中開始最早的初始化。

  ·頁面類中下一個將執行的方法是DeterminePostBackMode。這個方法允許您修改IsPostBack的值及相關的事件。如果您需要從資料庫中載入ViewState這個方法將特別有用,因為ViewState只有在IsPostBack為真的情況下才會進行恢複。返回空將會導致強制執行非回傳,返回Request.Form則強制執行一個回傳。除非在特殊情況下,否則並不建議去操作這個,因為這個還會影響其他的事件。

  ·下一個將要執行的方法是OnInit方法,一般這是第一個真正被使用的方法。這個方法觸發時,所有頁面定義中的控制項執行初始化,這意味著所有在頁面中定義的值應用到相應的控制項上。不過,ViewState和傳回的值還不會應用到控制項上,因此,任何被代碼或使用者改變的值還沒有被恢複到控制項上。這個方法通常是最好的建立、重建立動態控制項的好地方。

二、恢複及載入

  ·下一個方法,LoadPageStateFromPersistenceMedium只會在頁面被回傳的時候才會被執行。如果因為使用Session或自訂儲存方式,您修改了後面將要提到的影響ViewState儲存方式的方法SavePageStateToPersistenceMedium,則這個方法需要被重寫。預設的實現中ViewState是一種Base64格式編碼,並且被儲存在頁面的隱藏欄位中,您可以使用這篇文章中提及的方法修改ViewState按以上兩種方式儲存。注意:這個方法並沒有真正載入ViewState到頁面或頁面控制項中。

  ·當得到ViewState後,下一個方法LoadViewSate,將以遞迴的方式恢複ViewState到頁面及各個頁面控制項或子控制項中。這個方法執行後,每個控制項都將恢複到上一次的狀態,但是使用者提交的資料還沒有應用到控制項上,因為他們不是ViewState的一部分。這個方法主要用於恢複您在其他事件中動態產生的控制項的值,他們的值是您手動儲存在ViewSate中,並且現在已經失效。

  ·下一個方法是ProcessPostData,這個方法也同樣是回傳的時候才會被執行,並且不允許被重寫,這個是頁面基類的私人方法。這個方法通過匹配控制項的名稱恢複相應的使用者提交的控制項的值,到這一步意味著整個頁面都已經被完全恢複了。唯一要記住的是所有動態控制項的建立必須在這個方法之前。這個方法也是記錄後面的改變事件的方法。

  ·下一個方法是OnLoad方法,通常這是用得最多的方法,因為這個方法是頁面生存期第一個恢複了所有值的地方。大多數代碼根據判斷IsPostBack來決定是否重新設定控制項狀態。您也可以在這個方法中調用Validate並且檢查IsValid的值。也可以在這個方法中建立動態控制項,並且該控制項的所有的方法都會被執行以追上當前頁面的狀態包括ViewSate,不過不包括回傳的值。

三、事件處理

  ·下一個方法還是ProcessPostData,實際上就是前一個方法的另一次調用,它仍然是只在回傳的時候執行並且由於是私人方法不可以被重寫。如果您是第一次看頁面的運行軌跡也許會覺得這個方法有些多餘。但實際上這個方法是必要的因為在OnLoad中建立的動態控制項也需要他們回傳的值。任何在這以後建立的控制項將可以得到他們的ViewState,但是不能再得到他們的回傳的值,並且不會觸發任何值改變事件(Change Event)。

  ·下一個方法,RaiseChangedEvents,也是只在回傳頁面中執行,並且也因為是基類的私人方法所有不能被繼承。在整個頁面生存期中,是在這兒根據之前的ProcessPostData記錄的控制項的值和提交的值是否不同來觸發值改變事件。您也許需要調用Validate或者檢查IsValid的值。這裡並沒有特別的說明多個值改變事件的執行先後順序。

  ·下一個方法,RaisePostBackEvent,同樣是因為是基類的私人方法不能被繼承,同樣也是只在回傳頁面中執行。除非使用了AutoPostBack,不然這是實際提交表單事件執行的地方,特別是按鈕或者其實使用javascript提交表單等。如果還沒有被手動調用過並且使用了驗證控制項,那麼Validate會被調用。注意IE中有個BUG有時會允許提交但卻不觸發任何事件。

  ·下一個方法是OnPreRender,一般這是在用戶端展現頁面之前改變頁面及其控制項的最後一次機會。您也可以在這個方法裡面建立動態控制項,並且所有的方法都會被執行以追上當前頁面的狀態包括ViewSate,但是私人方法將不會被執行,這意味著不會有回傳的值並且不會有事件觸發。由於IE中的BUG,這是一個沒有事件趕上PostBack的好地方。

四、儲存及顯示

  ·下一個方法是SaveViewState,不論是否是回傳頁面,均會遞迴的執行以儲存頁面及其所有控制項的ViewState。ViewState基本上儲存所有與定義在aspx中的原始值不同的值,不管是被代碼還是使用者所改變。注意控制項值是根據他們在頁面的控制項樹中的位置來儲存的,所以如果動態控制項後來加到了錯誤的位置將會導致混亂。

  ·下一個方法是SavePageStateToPersistenceMedium真正的儲存頁面的ViewSate。這個方法隨同LoadPageStateFromPersistenceMediumg 一起被重寫以便儲存ViewState到Session或其它自訂資料,而不是用隱藏欄位。這對於低頻寬的使用者來說是很有協助的。並且對於行動裝置來說,Session是預設設定。下面這篇文章描述了使用以上兩種方式儲存ViewState的具體細節。注意在Asp.net中有個Bug:Asp.net要求必須提交__viewstate欄位,即使是空的。

  ·下一個方法是Render方法,該方法遞迴的建立並發送相應控制項的html給瀏覽器。這個方法被一些頁面模板方案重寫以添加一些通用的頁面頭與腳而不使用伺服器控制項,他們總是有一些額外的東西。注意這兒的修改只能使用純HTML,因為控制項在這兒已經被產生了。您可以用StringBuilder,StringWriter,HtmlTextWriter捕獲相應的HTML輸出。

  · 最後的方法是OnUnload,這個方法會調用相應的Dispose方法。這個方法提供機會以便清空該頁面中使用的非託管資源,如關閉開啟的檔案控制代碼,以前開啟的資料庫連接等。注意這個方法是在頁面已經發送到用戶端以後執行的,所以它只有影響伺服器對象,並且它不會顯示在頁面的顯示軌跡中。這就是頁面的生存期,對於每一次請求都是這麼啟動並執行。

  表1:頁面事件總結

  方法回傳控制項

  ConstructorAlwaysAll

  AddParsedSubObjectAlwaysAll

  DeterminePostBackModeAlwaysPage

  OnInitAlwaysAll

  LoadPageStateFromPersistenceMediumPostBackPage

  LoadViewStatePostBackAll

  ProcessPostData1PostBackPage

  OnLoadAlwaysAll

  ProcessPostData2PostBackPage

  RaiseChangedEventsPostBackPage

  RaisePostBackEventPostBackPage

  OnPreRenderAlwaysAll

  SaveViewStateAlwaysAll

  SavePageStateToPersistenceMediumAlwaysPage

  RenderAlwaysAll

  OnUnloadAlwaysAll

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.