ASP.NET 生命周期

2022-02-08 17:56 更新

生命周期

ASP.NET 生命周期指定如何:

  • ASP.NET 處理頁面生成動(dòng)態(tài)輸出
  • 應(yīng)用程序及其頁面進(jìn)行實(shí)例化和處理
  • ASP.NET 動(dòng)態(tài)編譯頁面

ASP.NET 生命周期可以被分為兩組:

  • 應(yīng)用程序生命周期
  • 頁面生命周期

ASP.NET 應(yīng)用程序生命周期

應(yīng)用程序生命周期有以下階段:

  • 用戶請求訪問應(yīng)用程序的資源,即一個(gè)頁面。瀏覽器發(fā)送此請求到 web 服務(wù)器。
  • 一個(gè)統(tǒng)一管道接收第一個(gè)請求,并發(fā)生以下事件:
    • 一個(gè) ApplicationManager 類的對象創(chuàng)建。
    • 一個(gè) HostingEnvironment 類的對象創(chuàng)建從而提供信息資源。
  • 創(chuàng)建響應(yīng)對象。應(yīng)用程序?qū)ο笕?HttpContext,HttpRequest 和 HttpResponse 被創(chuàng)建并初始化。
  • 一個(gè) HttpApplication 對象的實(shí)例被創(chuàng)建并被分配到請求。
  • 請求由 HttpApplication 類所處理。不同的事件引發(fā)此類處理請求。

ASP.NET 頁面生命周期

當(dāng)請求一個(gè)頁面時(shí),頁面被加載到服務(wù)器內(nèi)存,然后處理并送達(dá)到瀏覽器中。然后再從內(nèi)存中卸載。在這些步驟中的每一步,方法和事件都是可用的,可以根據(jù)應(yīng)用程序所需進(jìn)行改寫。換言之,你可以編寫自己的代碼從而去置換缺省代碼。

頁面類創(chuàng)建了頁面上所有控件的等級樹。頁面上所有的組件,除了指令,其余都是控件樹的一部分。你可以通過在頁面指令上添加 trace = "true" 來看到控制樹。我們會(huì)覆蓋頁面指令,然后在 'directives' 和 'event handling' 下追蹤。

頁面生命周期階段為:

  • 初始化
  • 頁面控件實(shí)例化
  • 狀態(tài)恢復(fù)和維護(hù)
  • 事件處理代碼的執(zhí)行
  • 頁面顯示

理解頁面周期幫助我們編寫代碼從而使一些具體的事情可以在頁面生命周期中任何階段發(fā)生。它同樣幫助編寫自定義控件并且在合適的時(shí)間將其初始化,利用視圖狀態(tài)下的數(shù)據(jù)填充其屬性,并且運(yùn)行控件行為的代碼。

以下是一個(gè) ASP.NET 頁面的不同階段:

  • 頁面請求 - 當(dāng) ASP.NET 得到一個(gè)頁面請求,它決定是否解析和編譯頁面,或者會(huì)有一個(gè)頁面的緩存版本;相應(yīng)地進(jìn)行回應(yīng)。
  • 頁面生命周期的開啟 - 在這個(gè)階段,設(shè)置請求和回應(yīng)對象。如果是一個(gè)舊的請求或者是回發(fā)的,頁面 IsPostBack 屬性設(shè)置為正確。頁面 ULCulture 屬性同樣也被設(shè)置。
  • 頁面初始化 - 在此階段,頁面上的控件通過設(shè)置 UniqueID 屬性被分配到獨(dú)特的 ID 并應(yīng)用主題。對于一個(gè)新的請求,加載回發(fā)數(shù)據(jù)并且控件屬性被重新儲存到視圖狀態(tài)下的值。
  • 頁面加載 - 在此階段,設(shè)置控件屬性,使用視圖狀態(tài)和控件狀態(tài)值。
  • 驗(yàn)證 - 調(diào)用驗(yàn)證控件的校驗(yàn)方法并成功執(zhí)行,頁面的 IsValid 屬性設(shè)置為 true。
  • 回發(fā)事件處理 - 如果請求是一個(gè)回發(fā)(舊請求),相關(guān)事件處理程序被調(diào)用。
  • 頁面顯示 - 在此階段,頁面的視圖狀態(tài)和所有控件被保存。頁面為每一個(gè)控件調(diào)用顯示方法,并且呈現(xiàn)的輸出被寫入頁面響應(yīng)屬性中的 OutputStream 類。
  • 卸載 - 顯示過的頁面被送達(dá)客戶端以及頁面屬性,例如響應(yīng)和請求,被卸載并全部清除完畢。

ASP.NET 頁面生命周期事件

在頁面生命周期的每一階段,頁面引發(fā)一些時(shí)間,會(huì)被編碼。一個(gè)事件處理程序基本上是一個(gè)函數(shù)或子程序,綁定到事件,使用聲明式如 OnClick 屬性或處理。

以下是頁面生命周期事件:

  • PreInit - PreInit 是頁面生命周期的第一個(gè)事件。它檢查 IsPostBack 屬性并決定頁面是否是回發(fā)。它設(shè)置主題及主版頁,創(chuàng)建動(dòng)態(tài)控件,并且獲取和設(shè)置值配置文件屬性值。此事件可通過重載 OnPreInit 方法或者創(chuàng)建一個(gè) Page_PreInit 處理程序進(jìn)行處置。
  • Init - Init 事件初始化控件屬性,并且建立控件樹。此事件可通過重載 OnInit 方法或者創(chuàng)建一個(gè) Page_Init處理程序進(jìn)行處置。
  • InitComplete - InitComplete 事件允許對視圖狀態(tài)的跟蹤。所有的控件開啟視圖狀態(tài)下的跟蹤。
  • LoadViewState - LoadViewState 事件允許加載視圖狀態(tài)信息到控件中。
  • LoadPostData - 在此階段期間,對所有由 \ 標(biāo)簽定義的輸入字段的內(nèi)容進(jìn)行處理。
  • PreLoad - PreLoad 在回發(fā)數(shù)據(jù)加載在控件中之前發(fā)生。此事件可以通過重載 OnPreLoad 方法或者創(chuàng)建一個(gè) Pre_Load 處理程序進(jìn)行處置。
  • Load - Load 事件被頁面最先引發(fā),然后遞歸地引發(fā)所有子控件。控件樹中的控件就被創(chuàng)建好了。此事件可通過重載 OnLoad 方法或者創(chuàng)建一個(gè) Page_Load 處理程序來進(jìn)行處置。
  • LoadComplete - 加載進(jìn)程完成,控件事件處理程序運(yùn)行,頁面驗(yàn)證發(fā)生。此事件可通過重載 OnLoad 方法或者創(chuàng)建一個(gè) Page_LoadComplete 處理程序來進(jìn)行處置。
  • PreRender - PreRender 事件就在輸出顯示之前發(fā)生。通過處理此事件,頁面和控件可以在輸出顯示之前執(zhí)行任何更新。
  • PreRenderComplete - 當(dāng) PreRender 事件為所有子控件被循環(huán)引發(fā),此事件確保了顯示前階段的完成。
  • SaveStateComplete - 頁面控件狀態(tài)被保存。個(gè)性化、控件狀態(tài)以及視圖狀態(tài)信息被保存。
  • UnLoad - UnLoad 階段是頁面生命周期的最后一個(gè)階段。它為所有控件循環(huán)引發(fā) UnLoad 事件,最后為頁面自身引發(fā)。最終完成清理和釋放所有資源和引用,比如數(shù)據(jù)庫連接。此事件可通過調(diào)整 OnLoad 方法或者創(chuàng)建一個(gè) Page_UnLoad 處理程序來進(jìn)行處置。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號