ASP.NET頁面生命週期與應用程式生命週期
頁面生命週期
頁面生命週期執行一系列步驟:頁面的初始化、例項化控制元件、還原和維護狀態、執行事件處理程式程式碼、呈現。為了在合適的階段執行所需的程式碼,所以要對頁面生命週期非常熟悉。在頁生命週期的各個階段,頁面會逐個引發定義的事件,通過對程式碼開發,在頁面的生命事件中執行我們所需要的程式
頁生命週期階段
1、 頁請求:發生在頁面生命週期之前,使用者請求頁時,ASP.NET將確定是否需要分析和編譯頁,從而確定是否開始頁面的生命週期,或者是否可以在不執行頁的情況下傳送頁面快取以進行響應。
2、 開始:設定頁屬性,如:HttpContext以及其他屬性;在此階段,頁面需要確定是回發請求還是新請求,並設定IsPostBack屬性;設定頁面的UICulture屬性。
3、 頁面初始化:載入所有主題;控制元件生成,並設定UniqueID;
注:ViewState、ControlState中的值還未載入至控制元件;如果頁面是回發,則回發資料也還未載入;故此時控制元件可以訪問,但值可能出錯。
4、 載入:如果當前請求是回發請求,則為控制元件載入ViewState和ControlState中的值。
5、 驗證:呼叫所有驗證程式控制元件的Validate方法,此方法將設定驗證程式控制元件和頁的IsValid屬性。
6、 回發事件處理:如果請求是回發請求,則呼叫所有事件處理程式。
7、 呈現:首先對該頁和所有控制元件進行儲存檢視狀態,然後對每個控制元件呼叫Render方法,它會提供一個文字編寫器,用於將控制元件的輸入寫入頁的Response屬性的OutputStream中。
8、 解除安裝:完成呈現,並已將頁傳送至客戶端、準備丟棄該頁後,呼叫解除安裝。將解除安裝屬性如:Response和Request等等。
頁生命週期事件:
1、PreInit
完成操作:檢查IsPostBack屬性來確定是不是第一次處理該頁;
建立或重新建立動態控制元件
動態設定主控頁
動態設定Theme屬性
讀取或設定配置檔案屬性
注:如果請求是回發請求,則控制元件的值尚未從檢視狀態恢復,即:不應該在此事件中設定控制元件屬性。
2、Init
完成操作:在所有控制元件都已經初始化並且應用所有外觀設定後引發。使用該事件來讀取和初始化控制元件屬性。
3、InitComplete
完成操作:由Page物件引發,使用該事件來處理要求完成所有初始化工作的任務。
4、PreLoad
完成操作:為頁和所有控制元件載入檢視狀態,然後處理Request 例項包括的任何回發資料。
注:如果需要在Load之前對頁或控制元件進行處理,需要該事件。
5、Load
完成操作:以遞迴方式載入所有控制元件。
6、控制元件事件
完成操作:處理控制元件引發的事件。
注:在回發請求中,如果頁包含驗證程式控制元件,請在執行任何處理之前檢查Page和各個驗證控制元件的IsValid屬性。
7、LoadComplete
8、PreRender
在控制元件輸出前最後的修改機會。
注:在該事件發生前的操作:
Page對所有控制元件遞迴進行EnsureChildControl操作
設定了DataSourceID屬性的資料繫結控制元件會呼叫DataBind方法。
9、SaveStateComplete
在該事件發生前,已經對控制元件的ViewState進行了儲存。將忽略對頁和控制元件所作的所有修改。
10、Render
方法,便於開發
11、UnLoad
應用程式生命週期
在應用程式的生命週期期間,應用程式會引發可處理的事件並呼叫可重寫的特定方法。若要處理應用程式事件或方法,可以在應用程式根目錄中建立一個名為 Global.asax 的檔案。如果建立了 Global.asax 檔案,ASP.NET 會將其編譯為從 HttpApplication 類派生的類,然後使用該派生類表示應用程式。
HttpApplication 程式的一個例項每次只處理一個請求。由於在訪問應用程式類中的非靜態成員時不需要將其鎖定,這樣可以簡化應用程式的事件處理過程。這樣還可以將特定於請求的資料儲存在應用程式類的非靜態成員中。例如,可以在 Global.asax 檔案中定義一個屬性,然後為該屬性賦一個特定於請求的值。
Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。在應用程式域的生命週期期間,ASP.NET 僅呼叫這些方法一次,而不是對每個 HttpApplication 例項都呼叫一次。