ASP.NET 生命週期指定如何:
ASP.NET 處理頁面產生動態輸出
應用程式及其頁面進行實例化和處理
ASP.NET 動態編譯頁面
ASP.NET 生命週期可以分成兩組:
應用程式生命週期
頁面生命週期
應用程式生命週期有以下階段:
使用者請求存取應用程式的資源,即一個頁面。瀏覽器發送此請求到web 伺服器。
一個統一管道接收第一個請求,並發生以下事件:
一個ApplicationManager 類別的物件建立。
一個HostingEnvironment 類別的物件創建從而提供資訊資源。
建立響應對象。應用程式物件如HttpContext,HttpRequest 和HttpResponse 被建立並初始化。
一個HttpApplication 物件的實例被建立並被指派到請求。
請求由HttpApplication 類別所處理。不同的事件引發此類處理請求。
當請求一個頁面時,頁面被載入到伺服器內存,然後處理並發送達到瀏覽器。然後再從記憶體中卸載。在這些步驟中的每一步,方法和事件都是可用的,可以根據應用程式所需進行改寫。換言之,你可以寫自己的程式碼從而去置換預設程式碼。
頁面類別建立了頁面上所有控制項的等級樹。頁面上所有的元件,除了指令,其餘都是控制樹的一部分。你可以透過在頁面指令上新增trace = "true" 來看到控制樹。我們會覆蓋頁面指令,然後在'directives' 和'event handling' 下追蹤。
頁面生命週期階段為:
初始化
頁面控制項實例化
狀態恢復和維護
事件處理程式碼的執行
頁面顯示
理解頁面週期幫助我們編寫程式碼從而使一些具體的事情可以在頁面生命週期中任何階段發生。它同樣有助於編寫自訂控制項並且在適當的時間將其初始化,利用視圖狀態下的資料填充其屬性,並且運行控制項行為的程式碼。
以下是一個ASP.NET 頁面的不同階段:
頁面請求- 當ASP.NET 得到一個頁面請求,它決定是否解析和編譯頁面,或會有一個頁面的快取版本;相應地回應。
頁面生命週期的開啟- 在這個階段,設定請求和回應物件。如果是舊的請求或是回發的,頁面IsPostBack 屬性設定為正確。頁面ULCulture 屬性同樣也被設定。
頁面初始化- 在此階段,頁面上的控制項透過設定UniqueID 屬性被指派到獨特的ID 並套用主題。對於一個新的請求,載入回發資料並且控制項屬性被重新儲存到視圖狀態下的值。
頁面載入- 在此階段,設定控制項屬性,使用視圖狀態和控制項狀態值。
驗證- 呼叫驗證控制項的校驗方法並成功執行,頁面的IsValid 屬性設定為true。
回發事件處理- 如果請求是一個回發(舊請求),相關事件處理程序被呼叫。
頁面顯示- 在此階段,頁面的視圖狀態和所有控制項會儲存。頁面為每個控制項呼叫顯示方法,並且呈現的輸出被寫入頁面回應屬性中的OutputStream 類別。
卸載- 顯示的頁面被送達客戶端以及頁面屬性,例如回應和請求,被卸載並全部清除完畢。
在頁面生命週期的每一階段,頁面引發一些時間,會被編碼。一個事件處理程序基本上是一個函數或子程序,綁定到事件,使用聲明式如OnClick 屬性或處理。
以下是頁面生命週期事件:
PreInit - PreInit 是頁面生命週期的第一個事件。它檢查IsPostBack 屬性並決定頁面是否為回發。它設定主題及主版頁,建立動態控件,並且取得和設定值設定檔屬性值。此事件可透過重載OnPreInit 方法或建立Page_PreInit 處理程序進行處置。
Init - Init 事件初始化控制項屬性,並且建立控制項樹。此事件可透過重載OnInit 方法或建立Page_Init處理程序來處置。
InitComplete - InitComplete 事件允許對視圖狀態的追蹤。所有的控制項開啟檢視狀態下的追蹤。
LoadViewState - LoadViewState 事件允許載入視圖狀態資訊到控制項中。
LoadPostData - 在此階段期間,對所有由 標籤定義的輸入欄位的內容進行處理。
PreLoad - PreLoad 在回發資料載入在控制項之前發生。此事件可以透過重載OnPreLoad 方法或建立Pre_Load 處理程序進行處置。
Load - Load 事件被頁面最先引發,然後遞歸地引發所有子控制項。控制項樹中的控制項就被建立好了。此事件可透過重載OnLoad 方法或建立Page_Load 處理程序來進行處置。
LoadComplete - 載入程序完成,控制項事件處理程序執行,頁面驗證發生。此事件可透過重載OnLoad 方法或建立Page_LoadComplete 處理程序來進行處置。
PreRender - PreRender 事件就在輸出顯示之前發生。透過處理此事件,頁面和控制項可以在輸出顯示之前執行任何更新。
PreRenderComplete - 當PreRender 事件為所有子控制項被循環引發,此事件確保了顯示前階段的完成。
SaveStateComplete - 頁面控制項狀態已儲存。個人化、控制狀態以及視圖狀態資訊被保存。
UnLoad - UnLoad 階段是頁面生命週期的最後一個階段。它為所有控制項循環引發UnLoad 事件,最後為頁面本身引發。最終完成清理和釋放所有資源和引用,例如資料庫連接。此事件可透過調整OnLoad 方法或建立Page_UnLoad 處理程序來進行處置。