使用者透過瀏覽器發送一個請求(Request)到伺服器端,伺服器端會依照請求內容讀取所需要的資料,並建立ASP.NET Page物件,當執行 ASP.NET 網頁時,網頁在生命週期內會執行一系列處理步驟。其中包括初始化、產生控制項、還原和維護狀態、執行事件處理常式程式碼和呈現(參考MSDN網站)。伺服器端將結果組成網頁程式碼(HTML)供瀏覽器讀取及呈現,回傳結果分為兩個部分,第一部分為網頁的呈現資料(HTML Tag)、第二部份為(hidden input:存放viewstate,ASP.NET用來紀錄網頁資料的方式)。
關係請參考下圖
前言
當一個頁面請求發送到Web 服務器,ASP.NET 網頁會進行生命週期一系列的步驟,這些步驟包括初始化、載入、事件處理、顯示….等階段,在網頁生命週期的每個階段中,都會觸發不同的事件,因此了解ASP.NET 網頁生命週期對開發人員是很重要的,知道在什麼時間點會觸發哪些事件及可以設定網頁的屬性,舉例來說,今天要動態改變主題,就必須到PreInit事件修改Page的Theme屬性;假設要動態建立控制項,就必須在每次Postback事件時將控制項重新建立起來,否則Postback之後動態建立的控制項將會找不到。如果對於網頁生命週期不熟悉的話,在遇到上列問題時,相信會花更多不必要的時間才能解決問題。
概述
使用者透過瀏覽器發送一個請求(Request)到伺服器端,伺服器端會依照請求內容讀取所需要的資料,並建立ASP.NET Page物件,當執行 ASP.NET 網頁時,網頁在生命週期內會執行一系列處理步驟。其中包括初始化、產生控制項、還原和維護狀態、執行事件處理常式程式碼和呈現(參考MSDN網站)。伺服器端將結果組成網頁程式碼(HTML)供瀏覽器讀取及呈現,回傳結果分為兩個部分,第一部分為網頁的呈現資料(HTML Tag)、第二部份為(hidden input:存放viewstate,ASP.NET用來紀錄網頁資料的方式)。
關係請參考下圖
Page Life-Cycle Stages(生命週期階段)
網頁的生命周期分為下列八個階段,每個階段所做的事MSDN都寫得很清楚,這裡就不在多介紹
- 網頁要求(Page Request)
- 啟動(Start)
- 初始化(Page Initialization)
- 載入(Load)
- 驗證(Validation)
- 事件處理(PostBack Event Handling)
- 顯示(Render)
- 卸載(Unload)
如何很快的記下這幾個階段?這裡有提供一個很容易記下這八個階段的方法,根據八個階段的英文縮寫,可以組合出”SILVERU”這個英文單字,這樣變得好記多了
Page Life-Cycle Events(生命週期常用事件)
在網頁生命週期的每個階段中,都會觸發不同的事件,舉例來說,初始化(Page Initialization)階段會觸發Page物件的PreInit、Init、InitComplete事件
MSDN網站有列出開發者常使用的網頁生命週期事件列表,包含PreInit、Init、InitComplete、PreLoad、Load、Control Event、LoadComplete、PreRender、SaveStateComplete、Render、Unload等幾項常用的生命週期事件。
這裡整理出每個階段常用的事件,請參考下圖
-
Page initialization
事件:PreInit、Init、InitComplete
說明:在這個階段,網頁(Page)及控制項(Control)會進行初始化,可以判斷是請求(Resquest)來源是第一次請求或是Postback、動態建立控制項、動態設定主版頁面、動態設定Theme屬性設定。 -
Loading
事件:PreLoad、Load、LoadComplete
說明:如果是Postback,此階段會將ViewState載入到控制項的屬性中。最常看到的Page_Load事件就是在此階段中。 - Postback event handling
-
Page initialization
事件:處理控制項所觸發的事件
說明:這些控制項事件可以用於處理特定控制項事件,例如Button控制項的Click事件。
(特定控制項事件:按下Button的click事件,事件流程會是Page initialization > Loading> Button_Click事件,只有Postback才會進入此事件) -
Rendering
事件:PreRender、Render
說明: 顯示網頁階段,Page物件會呼叫SaveViewState的方法來儲存ViewState的資訊,接下來Page物件呼叫Render方法(先Page,在Page底下的Control),透過Render方法,會將根據控制項的類型,輸出所對應類型的外觀及長相(HTML Tag),並存放在Response的OutputStream屬性中。Ps : Render不是一個真正的事件 -
Unloading
事件:Unload
說明:在這個事件中,所有的控制項都已經被Render為OutputStream,無法修改OutputStream內容,否則網頁就會爆炸擲回例外狀況。在控制項中,這個事件可以用於對特定控制項執行最終清除,例如關閉控制項特定的資料庫連接。
更詳細的事件資料可以參考 [ASP.NET]Page Life Cycle整理 by 91哥、ASP.NET 網頁存留週期概觀
補充:
在查資料的過程中,很幸運的找到一篇文章(Page LifeCycle),這篇文章從PreInit到最後的Unload,作者很詳細的介紹網頁生命週期事件(如下圖所示),而且每個流程都有加上說明文字介紹(超讚!),有興趣深入研究的朋友可以自行取用,如下圖所示
PS 作者提到此事件流程為ASP.NET 2.0的版本,有些事件及內容有可能已經有異動過!
參考
之前在開發專案時,發覺自己對於生命週期的事件有些疑惑
所以開始上網找有關Page Life-Cycle資料,看越多相關資料,才發現自己懂得真的很少
將資料整理後寫成這篇文章方便自己紀錄,如果內容有錯誤的地方,麻煩各位高手給予小弟指導,謝謝 :D
ps :如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,感謝
http://www.randyconnolly.com/Core/page/Page-Lifecycle.aspx
http://www.dotblogs.com.tw/hatelove/archive/2009/12/18/pagelifecycle.aspx
http://msdn.microsoft.com/zh-tw/library/ms178472(v=VS.90).aspx
http://www.cnblogs.com/DotNetNuke/archive/2008/09/28/1301406.html
http://msdn.microsoft.com/en-us/library/ms972976.aspx#viewstate_topic2
http://www.docstoc.com/docs/23970233/ASPNET-Page-Life-Cycle
http://www.cnblogs.com/DotNetNuke/archive/2008/09/28/1301406.html