內容頁與主版頁面載入事事件處理的先後順序
在最終訪問結果頁時,實際訪問的是內容頁與主版頁面。作為有密切關係的兩個頁面,它們各自要處理自身的初始化與載入等事件。這個過程總體上可以由來展示:
載入主版頁面和內容頁共需經過如上8個過程。通過這8個過程可以看出初始化和載入主版頁面與內容頁是一個相互交疊的過程。這8個過程中對應著11個具體的事件。如下:
- 主版頁面中控制項的Init事件;
- 內容頁中Content控制項的Init事件;
- 主版頁面Init事件;
- 內容頁Init事件;
- 內容頁Load事件;
- 主版頁面Load事件;
- 內容頁中Content控制項的Load事件;
- 內容頁PreRender事件;
- 主版頁面PreRender事件;
- 主版頁面控制項PreRender事件;
- 內容頁中Content控制項的PreRender事件;
可以看出內容頁和主版頁面中會引發相同的事件。例如,兩者都引發Init、Load和PreRender事件。引發事件的一般規律是,初始化Init事件從最裡面的控制項(主版頁面)向最外面的控制項(Content控制項及內容頁)引發,所有其他事件則從最外面的控制項向最裡面的控制項引發。需要明確的是,主版頁面會合并到內容頁中,並被視為內容頁中的一個控制項。
對於不包含主版頁面的頁面,這個流程如下:
PreInit
Init,InitComplete
PreLoad
Load,LoadComplete
PreRender,PreRenderComplete
SaveStateComplete
Unload
:
在頁面第一次載入期間,生命週期包括下列步驟:
- 運行建構函式。對於頁面或頁面上的任何控制項,這是生命週期的第一步。
- 確定回傳模式。是第一次載入,或者是自回傳,還是跨頁回傳。
- 預初始化。為了在第一個頁面初始化之前確定目標裝置,這一步是必須的。PreInit是生命週期中第一個事件,該事件使用OnPreInit方法處理事件。
- 載入並初始化個人化主題
- 初始化。在初始化階段構建控制項樹。在這個階段可以為請求初始化任何值。通過處理Init事件的OnInit方法可以實現對初始化階段的修改。
- 預先載入。在回傳資料被載入進控制項前發生。通過處理PreLoad事件的OnPreLoad方法可以實現對該階段的修改。
- 載入。在此階段,使用者代碼運行,表單控制項顯示用戶端資料。檢視狀態資料可用,還可以訪問頁面控制項階層內的控制項。通過處理Load事件的OnLoad方法可以實現對載入階段的修改。
- 載入完成。完成載入過程。通過處理LoadComplete事件的OnLoadComplete方法可以實現對該階段的修改。
- 預呈現。這是輸出呈現前的一個階段。通過處理PreRender事件的OnPreRender方法可以實現對該階段的修改。
- 儲存狀態。個人化、控制項、視圖還有頁面狀態資訊都被儲存。
- 呈現。在此階段,頁面及其控制項輸出呈現為HTML。可以使用Render方法進行重寫。在Render方法內,如果有必要的話,可以調用CreateChildControls方法實現在控制項樹內建立並初始化伺服器控制項。
- 卸載。這是生命週期的最後階段。這個階段提供了一個機會,以便完成最終的清除工作,並釋放對任何耗費資源的資源,例如,資料庫連接。這對於規模是非常重要的。可以通過使用OnUnload方法來處理。
在回傳期間,有以下幾點與第一次載入不同:
- 載入狀態。初始化完成後,載入頁面和控制項狀態,同時,從頁面上的一個隱藏變數載入檢視狀態。
- 處理回傳資料。在這個階段,通過Post方法來處理髮送到伺服器的資料。通過LoadPostData方法可實現對於需要回傳的檢視狀態的任何更新。
- 預先載入和載入。這和第一次載入相同。
- 發送回傳變化通知。如果目前狀態較先前狀態發生了任何變化,就會通過RaiseChangedEvents方法引發變化事件。引發的順序和控制項在控制項樹種的順序相同。
- 處理回傳事件。確切的說是使用者行為導致了回傳。在所有變化事件得以處理後,將處理使用者行為。導致回傳的最初用戶端事件在RaisePostBackEvent方法中進行處理。
- 載入完成。從這裡開始,都和第一次載入相同。