生命周期
ASP.NET 生命周期指定如何:
- ASP.NET 處理頁面生成動態(tài)輸出
- 應用程序及其頁面進行實例化和處理
- ASP.NET 動態(tài)編譯頁面
ASP.NET 生命周期可以被分為兩組:
ASP.NET 應用程序生命周期
應用程序生命周期有以下階段:
- 用戶請求訪問應用程序的資源,即一個頁面。瀏覽器發(fā)送此請求到 web 服務器。
- 一個統(tǒng)一管道接收第一個請求,并發(fā)生以下事件:
- 一個 ApplicationManager 類的對象創(chuàng)建。
- 一個 HostingEnvironment 類的對象創(chuàng)建從而提供信息資源。
- 創(chuàng)建響應對象。應用程序對象如 HttpContext,HttpRequest 和 HttpResponse 被創(chuàng)建并初始化。
- 一個 HttpApplication 對象的實例被創(chuàng)建并被分配到請求。
- 請求由 HttpApplication 類所處理。不同的事件引發(fā)此類處理請求。
ASP.NET 頁面生命周期
當請求一個頁面時,頁面被加載到服務器內存,然后處理并送達到瀏覽器中。然后再從內存中卸載。在這些步驟中的每一步,方法和事件都是可用的,可以根據(jù)應用程序所需進行改寫。換言之,你可以編寫自己的代碼從而去置換缺省代碼。
頁面類創(chuàng)建了頁面上所有控件的等級樹。頁面上所有的組件,除了指令,其余都是控件樹的一部分。你可以通過在頁面指令上添加 trace = "true" 來看到控制樹。我們會覆蓋頁面指令,然后在 'directives' 和 'event handling' 下追蹤。
頁面生命周期階段為:
- 初始化
- 頁面控件實例化
- 狀態(tài)恢復和維護
- 事件處理代碼的執(zhí)行
- 頁面顯示
理解頁面周期幫助我們編寫代碼從而使一些具體的事情可以在頁面生命周期中任何階段發(fā)生。它同樣幫助編寫自定義控件并且在合適的時間將其初始化,利用視圖狀態(tài)下的數(shù)據(jù)填充其屬性,并且運行控件行為的代碼。
以下是一個 ASP.NET 頁面的不同階段:
- 頁面請求 - 當 ASP.NET 得到一個頁面請求,它決定是否解析和編譯頁面,或者會有一個頁面的緩存版本;相應地進行回應。
- 頁面生命周期的開啟 - 在這個階段,設置請求和回應對象。如果是一個舊的請求或者是回發(fā)的,頁面 IsPostBack 屬性設置為正確。頁面 ULCulture 屬性同樣也被設置。
- 頁面初始化 - 在此階段,頁面上的控件通過設置 UniqueID 屬性被分配到獨特的 ID 并應用主題。對于一個新的請求,加載回發(fā)數(shù)據(jù)并且控件屬性被重新儲存到視圖狀態(tài)下的值。
- 頁面加載 - 在此階段,設置控件屬性,使用視圖狀態(tài)和控件狀態(tài)值。
- 驗證 - 調用驗證控件的校驗方法并成功執(zhí)行,頁面的 IsValid 屬性設置為 true。
- 回發(fā)事件處理 - 如果請求是一個回發(fā)(舊請求),相關事件處理程序被調用。
- 頁面顯示 - 在此階段,頁面的視圖狀態(tài)和所有控件被保存。頁面為每一個控件調用顯示方法,并且呈現(xiàn)的輸出被寫入頁面響應屬性中的 OutputStream 類。
- 卸載 - 顯示過的頁面被送達客戶端以及頁面屬性,例如響應和請求,被卸載并全部清除完畢。
ASP.NET 頁面生命周期事件
在頁面生命周期的每一階段,頁面引發(fā)一些時間,會被編碼。一個事件處理程序基本上是一個函數(shù)或子程序,綁定到事件,使用聲明式如 OnClick 屬性或處理。
以下是頁面生命周期事件:
- PreInit - PreInit 是頁面生命周期的第一個事件。它檢查 IsPostBack 屬性并決定頁面是否是回發(fā)。它設置主題及主版頁,創(chuàng)建動態(tài)控件,并且獲取和設置值配置文件屬性值。此事件可通過重載 OnPreInit 方法或者創(chuàng)建一個 Page_PreInit 處理程序進行處置。
- Init - Init 事件初始化控件屬性,并且建立控件樹。此事件可通過重載 OnInit 方法或者創(chuàng)建一個 Page_Init處理程序進行處置。
- InitComplete - InitComplete 事件允許對視圖狀態(tài)的跟蹤。所有的控件開啟視圖狀態(tài)下的跟蹤。
- LoadViewState - LoadViewState 事件允許加載視圖狀態(tài)信息到控件中。
- LoadPostData - 在此階段期間,對所有由 \ 標簽定義的輸入字段的內容進行處理。
- PreLoad - PreLoad 在回發(fā)數(shù)據(jù)加載在控件中之前發(fā)生。此事件可以通過重載 OnPreLoad 方法或者創(chuàng)建一個 Pre_Load 處理程序進行處置。
- Load - Load 事件被頁面最先引發(fā),然后遞歸地引發(fā)所有子控件??丶渲械目丶捅粍?chuàng)建好了。此事件可通過重載 OnLoad 方法或者創(chuàng)建一個 Page_Load 處理程序來進行處置。
- LoadComplete - 加載進程完成,控件事件處理程序運行,頁面驗證發(fā)生。此事件可通過重載 OnLoad 方法或者創(chuàng)建一個 Page_LoadComplete 處理程序來進行處置。
- PreRender - PreRender 事件就在輸出顯示之前發(fā)生。通過處理此事件,頁面和控件可以在輸出顯示之前執(zhí)行任何更新。
- PreRenderComplete - 當 PreRender 事件為所有子控件被循環(huán)引發(fā),此事件確保了顯示前階段的完成。
- SaveStateComplete - 頁面控件狀態(tài)被保存。個性化、控件狀態(tài)以及視圖狀態(tài)信息被保存。
- UnLoad - UnLoad 階段是頁面生命周期的最后一個階段。它為所有控件循環(huán)引發(fā) UnLoad 事件,最后為頁面自身引發(fā)。最終完成清理和釋放所有資源和引用,比如數(shù)據(jù)庫連接。此事件可通過調整 OnLoad 方法或者創(chuàng)建一個 Page_UnLoad 處理程序來進行處置。
更多建議: