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