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