ASP.NET 頁面生命週期與應用程序生命週期

這篇blog是轉自 JerryShi's blof,地址:http://www.cnblogs.com/jerryshi/archive/2008/07/28/1254364.html

 

頁面生命週期

頁面生命週期執行一系列步驟:頁面的初始化、實例化控件、還原和維護狀態、運行事件處理程序代碼、呈現。爲了在合適的階段執行所需的代碼,所以要對頁面生命週期非常熟悉。在頁生命週期的各個階段,頁面會逐個引發定義的事件,通過對代碼開發,在頁面的生命事件中執行我們所需要的程序
頁生命週期階段

1、  頁請求:發生在頁面生命週期之前,用戶請求頁時,ASP.NET將確定是否需要分析和編譯頁,從而確定是否開始頁面的生命週期,或者是否可以在不運行頁的情況下發送頁面緩存以進行響應。

2、  開始:設置頁屬性,如:HttpContext以及其他屬性;在此階段,頁面需要確定是回發請求還是新請求,並設置IsPostBack屬性;設置頁面的UICulture屬性。

3、  頁面初始化:加載所有主題;控件生成,並設置UniqueID
注:ViewStateControlState中的值還未加載至控件;如果頁面是回發,則回發數據也還未加載;故此時控件可以訪問,但值可能出錯。

4、  加載:如果當前請求是回發請求,則爲控件加載ViewStateControlState中的值。

5、  驗證:調用所有驗證程序控件的Validate方法,此方法將設置驗證程序控件和頁的IsValid屬性。

6、  回發事件處理:如果請求是回發請求,則調用所有事件處理程序。

7、  呈現:首先對該頁和所有控件進行保存視圖狀態,然後對每個控件調用Render方法,它會提供一個文本編寫器,用於將控件的輸入寫入頁的Response屬性的OutputStream中。

8、  卸載:完成呈現,並已將頁發送至客戶端、準備丟棄該頁後,調用卸載。將卸載屬性如:ResponseRequest等等。

頁生命週期事件:

1PreInit
完成操作:檢查IsPostBack屬性來確定是不是第一次處理該頁;
                     
創建或重新創建動態控件
                     
動態設置主控頁
                     
動態設置Theme屬性
                     
讀取或設置配置文件屬性
注:如果請求是回發請求,則控件的值尚未從視圖狀態恢復,即:不應該在此事件中設置控件屬性。

2Init
完成操作:在所有控件都已經初始化並且應用所有外觀設置後引發。使用該事件來讀取和初始化控件屬性。

3InitComplete
完成操作:由Page對象引發,使用該事件來處理要求完成所有初始化工作的任務。

4PreLoad
完成操作:爲頁和所有控件加載視圖狀態,然後處理Request 實例包括的任何回發數據。
注:如果需要在Load之前對頁或控件進行處理,需要該事件。

5Load
完成操作:以遞歸方式加載所有控件。

6、控件事件
完成操作:處理控件引發的事件。

注:在回發請求中,如果頁包含驗證程序控件,請在執行任何處理之前檢查Page和各個驗證控件的IsValid屬性。

7LoadComplete

8PreRender
在控件輸出前最後的修改機會。
注:在該事件發生前的操作:
Page
對所有控件遞歸進行EnsureChildControl操作
設置了DataSourceID屬性的數據綁定控件會調用DataBind方法。

9SaveStateComplete
在該事件發生前,已經對控件的ViewState進行了保存。將忽略對頁和控件所作的所有修改。

10Render
方法,便於開發

11UnLoad

 

應用程序生命週期

 

在應用程序的生命週期期間,應用程序會引發可處理的事件並調用可重寫的特定方法。若要處理應用程序事件或方法,可以在應用程序根目錄中創建一個名爲 Global.asax 的文件。如果創建了 Global.asax 文件,ASP.NET 會將其編譯爲從 HttpApplication 類派生的類,然後使用該派生類表示應用程序。

HttpApplication 進程的一個實例每次只處理一個請求。由於在訪問應用程序類中的非靜態成員時不需要將其鎖定,這樣可以簡化應用程序的事件處理過程。這樣還可以將特定於請求的數據存儲在應用程序類的非靜態成員中。例如,可以在 Global.asax 文件中定義一個屬性,然後爲該屬性賦一個特定於請求的值。

Application_Start Application_End 方法是不表示 HttpApplication 事件的特殊方法。在應用程序域的生命週期期間,ASP.NET 僅調用這些方法一次,而不是對每個 HttpApplication 實例都調用一次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章