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
ASP.net 2.0新引進的一個事件,它是生命周期的進入點。該事件激發時,頁面還沒有關聯任何的母版頁和主題。
(完成操作:檢查IsPostBack屬性來確定是不是第一次處理該頁;
?????????????????? ??創建或重新創建動態控件
?????????????????? ??動態設置主控頁
?????????????????? ??動態設置Theme屬性
?????????????????? ??讀取或設置配置文件屬性
注:如果請求是回發請求,則控件的值尚未從視圖狀態恢復,即:不應該在此事件中設置控件屬性。)
2、Init
此時會遍歷頁面上的所有的子控件,使他們以一種上下文相關的方法寢化他們的狀態。所有的子控件遞歸地調用他們的OnInt方法。
(完成操作:在所有控件都已經初始化并且應用所有外觀設置后引發。使用該事件來讀取和初始化控件屬性。)
3、InitComplete
該事件是只有頁面才有的事件,它也是ASP.net 2.0新引進的一個事件。它表明初始化子階段的結束。對一個頁面而言,在init事件和InitComplete事件之間只發生一個操作:打開視圖狀態(ViewState)變更的跟蹤功能。跟蹤視圖狀態是這樣一個操作,它最終是控件能夠真正的把所有以編程方式添加到ViewState集合中的數值持久的存儲在存儲介質中。簡單的講,對于沒有跟蹤視圖狀態的控件,任何添加到ViewState的值將會在下一次回發時丟失。
(完成操作:由Page對象引發,使用該事件來處理要求完成所有初始化工作的任務。)
4、PreLoad
該事件指明頁面已經結束系統級初始化階段,并且準備進入下一個階段,即還有機會在該頁面中的用戶代碼中進一步配置頁面的執行和呈現,該事件只針對頁面引發。
(完成操作:為頁和所有控件加載視圖狀態,然后處理Request 實例包括的任何回發數據。
注:如果需要在Load之前對頁或控件進行處理,需要該事件。)
5、Load
Load事件首先針對頁面引發,然后遞歸地針對所有的子控件引發。頁面樹中的控件在此時創建,并且他們的狀態完全反映前一個狀態以及從客戶端發送的任何數據。頁面準備執行所有與頁面邏輯和行為有關的初始化代碼。
(完成操作:以遞歸方式加載所有控件。)
6、LoadComplete
加載完畢,此時程序執行結果已經加載到內存中。
7、PreRender
預呈現,通過處理該事件,頁面和控件可以在呈現輸出之前執行任何更新。PreRender事件首先為頁面激發,然后遞歸的為控件激發。
注:這個頁面保證創建所有的子控件。在該事件發生前的操作:
Page對所有控件遞歸進行EnsureChildControl操作
設置了DataSourceID屬性的數據綁定控件會調用DataBind方法。
8、PreRenderComplete事件
預呈現完畢,由于PreRender事件是遞歸地為所有的子控件激發的,所以無法知道何時完成預呈現階段,所以在asp.net2.0中加入了這樣一個只為頁面激發的事件。
9、SaveState事件
保存視圖狀態,在呈現每個控件以生成頁面的html標記之前,把頁面的當前狀態保存在視圖狀態存儲。
10、SaveStateComplete
視圖狀態保存完畢。
(在該事件發生前,已經對控件的ViewState進行了保存。將忽略對頁和控件所作的所有修改。)
11、Render
頁面呈現,輸出html格式的頁面。
12、控件事件
完成操作:處理控件引發的事件。
注:在回發請求中,如果頁包含驗證程序控件,請在執行任何處理之前檢查Page和各個驗證控件的IsValid屬性。
應用程序生命周期
?
在應用程序的生命周期期間,應用程序會引發可處理的事件并調用可重寫的特定方法。若要處理應用程序事件或方法,可以在應用程序根目錄中創建一個名為 Global.asax 的文件。如果創建了 Global.asax 文件,ASP.NET 會將其編譯為從 HttpApplication 類派生的類,然后使用該派生類表示應用程序。
HttpApplication 進程的一個實例每次只處理一個請求。由于在訪問應用程序類中的非靜態成員時不需要將其鎖定,這樣可以簡化應用程序的事件處理過程。這樣還可以將特定于請求的數據存儲在應用程序類的非靜態成員中。例如,可以在 Global.asax 文件中定義一個屬性,然后為該屬性賦一個特定于請求的值。
Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。在應用程序域的生命周期期間,ASP.NET 僅調用這些方法一次,而不是對每個 HttpApplication 實例都調用一次。
轉載于:https://www.cnblogs.com/flora_asp_net/archive/2009/08/04/1539112.html
總結
以上是生活随笔為你收集整理的ASP.NET页面生命周期与应用程序生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大言不惭的开源平台
- 下一篇: RDLC SubReports Expo