詳解ASP.NET頁(yè)面生命周期
ASP.NET頁(yè)面運(yùn)行時(shí)候,頁(yè)面將經(jīng)歷一個(gè)生命周期,在生命周期中將執(zhí)行一系列的處理步驟。包括初始化、實(shí)例化控件、還原和維護(hù)狀態(tài)、運(yùn)行時(shí)間處理程序代碼以及進(jìn)行呈現(xiàn)。熟悉頁(yè)面生命周期非常重要,這樣我們才能在生命周期的合適階段編寫(xiě)代碼。如果我們能在寫(xiě)代碼的時(shí)候想著我們現(xiàn)在是在做生命周期的哪一步那將是非常好的。
幾個(gè)代表性的問(wèn)題
在開(kāi)始的時(shí)候我們先思考幾個(gè)問(wèn)題,看看我們?cè)诿枋鐾觏?yè)面生命周期的時(shí)候,能不能回答上這幾個(gè)問(wèn)題
- 1.為什么在服務(wù)器端能通過(guò)this.textbox1.Text獲取到用戶(hù)提交過(guò)來(lái)的數(shù)據(jù)?
- 2.在Page_Load中Response.Write("hello")查看生成的html代碼原文件,hello在哪里?為什么?
- 3.有一個(gè)服務(wù)器端的按鈕,設(shè)置了點(diǎn)擊事件,該點(diǎn)擊事件什么時(shí)候執(zhí)行?是先執(zhí)行Page_Load事件還是先執(zhí)行點(diǎn)擊事件?
- 4.為什么在服務(wù)器端通過(guò)this.textbox1.Text設(shè)置值后,客戶(hù)端就能顯示出來(lái)?
了解ASP.NET請(qǐng)求管道、應(yīng)用程序生命周期、整體運(yùn)行機(jī)制童鞋可能知道,ASP.NET應(yīng)用程序周期中PreRequestHandlerExecute事件與PostRequestHandlerExecute事件之間就是我們的頁(yè)面生命周期了,對(duì)于aspx頁(yè)面就是一系列的打造頁(yè)面控件樹(shù),觸發(fā)各種頁(yè)面時(shí)間,對(duì)于一般處理程序ashx就是直接執(zhí)行咱們開(kāi)發(fā)者寫(xiě)的ProcessRequest方法了,對(duì)于MVC應(yīng)用程序就是創(chuàng)建控制器工廠(chǎng),創(chuàng)建控制器對(duì)象,調(diào)用Action那一套了。
下面主要講述的就是ASP.NET WebForm中的頁(yè)面的生命周期了。
我們用反編譯工具查看Page類(lèi)的ProcessRequest方法可以看見(jiàn)先調(diào)用了FrameworkInitialize; FrameworkInitialize里面就是打造了頁(yè)面控件樹(shù),然后調(diào)用了ProcessRequestMain,就開(kāi)始了執(zhí)行整個(gè)頁(yè)面生命周期了(其實(shí)就是調(diào)用了一系列的事件方法)(可能部分圖看不見(jiàn)右邊,可在新標(biāo)簽頁(yè)中打開(kāi)圖片)
1.打造頁(yè)面控件樹(shù)
FrameworkInitialize內(nèi)部調(diào)用了_buildControlTree()方法
上圖中左邊是前臺(tái)頁(yè)面的代碼,右邊是對(duì)應(yīng) 生成的打造控件樹(shù)的代碼。中間截取的是生成表單那一部分的代碼。
下面看一張?jiān)韴D
瀏覽器的DOM樹(shù)是根據(jù)Html標(biāo)簽生成一個(gè)C語(yǔ)言的DOM樹(shù),而ASP.NET服務(wù)器端是用C#打造的一個(gè)控件樹(shù),也是按照DOM結(jié)構(gòu)打造的。本質(zhì)是一樣。服務(wù)器端所有東西都加到頁(yè)面對(duì)象的控件集合中去了。標(biāo)簽在服務(wù)器端有對(duì)應(yīng)的控件對(duì)象的時(shí)候就用控件對(duì)象,沒(méi)有的時(shí)候就使用LiteralControl進(jìn)行封裝。不管是服務(wù)器控件還是字符串標(biāo)簽(沒(méi)有runat="server"的標(biāo)簽)都以控件對(duì)象的方式存在前臺(tái)頁(yè)面類(lèi)的控件集合里面。好處就是生成前臺(tái)頁(yè)面的html代碼的時(shí)候,只需要遍歷控件集合里面的每一個(gè)控件對(duì)象的RenderControl方法,每一個(gè)控件都會(huì)調(diào)用自己的Render方法生成對(duì)應(yīng)的Html字符串。那么所有控件的生成的html字符串就還原成一個(gè)頁(yè)面的html代碼了?! ?/p>
2.觸發(fā)PerformPreInit事件
在所有初始化之前初始化了這個(gè)事件,這個(gè)事件主要是初始化了主題,初始化了母版頁(yè)
private void PerformPreInit() { this.OnPreInit(EventArgs.Empty); this.InitializeThemes(); this.ApplyMasterPage(); this._preInitWorkComplete = true; }
3.觸發(fā)InitRecursive事件
4.觸發(fā)LoadAllState()事件
加載頁(yè)面狀態(tài)解析ViewState,將頁(yè)面表單中的ViewState進(jìn)行反Base64編碼,反序列化,存在頁(yè)面的ViewState屬性中
5.觸發(fā)ProcessPostData(this._requestValueCollection, true)事件
private void ProcessPostData(NameValueCollection postData, bool fBeforeLoad) { if (this._changedPostDataConsumers == null) { this._changedPostDataConsumers = new ArrayList(); } if (postData != null) { foreach (string str in postData) { if ((str != null) && !IsSystemPostField(str)) { Control control = this.FindControl(str); if (control == null) { if (fBeforeLoad) { if (this._leftoverPostData == null) { this._leftoverPostData = new NameValueCollection(); } this._leftoverPostData.Add(str, null); } } else { IPostBackDataHandler postBackDataHandler = control.PostBackDataHandler; if (postBackDataHandler == null) { if (control.PostBackEventHandler != null) { this.RegisterRequiresRaiseEvent(control.PostBackEventHandler); } } else { if (postBackDataHandler != null) { NameValueCollection postCollection = control.CalculateEffectiveValidateRequest() ? this._requestValueCollection : this._unvalidatedRequestValueCollection; if (postBackDataHandler.LoadPostData(str, postCollection)) { this._changedPostDataConsumers.Add(control); } } if (this._controlsRequiringPostBack != null) { this._controlsRequiringPostBack.Remove(str); } } } } } } ArrayList list = null; if (this._controlsRequiringPostBack != null) { foreach (string str2 in this._controlsRequiringPostBack) { Control control2 = this.FindControl(str2); if (control2 != null) { IPostBackDataHandler adapterInternal = control2.AdapterInternal as IPostBackDataHandler; if (adapterInternal == null) { adapterInternal = control2 as IPostBackDataHandler; } if (adapterInternal == null) { object[] args = new object[] { str2 }; throw new HttpException(SR.GetString("Postback_ctrl_not_found", args)); } NameValueCollection values2 = control2.CalculateEffectiveValidateRequest() ? this._requestValueCollection : this._unvalidatedRequestValueCollection; if (adapterInternal.LoadPostData(str2, values2)) { this._changedPostDataConsumers.Add(control2); } } else if (fBeforeLoad) { if (list == null) { list = new ArrayList(); } list.Add(str2); } } this._controlsRequiringPostBack = list; } }
主要做了兩件事
1)將表單里提交過(guò)來(lái)的控件數(shù)據(jù)設(shè)置給頁(yè)面對(duì)象的控件樹(shù)中對(duì)應(yīng)控件的屬性(給前面打造的控件樹(shù)里面控件給值),這樣在服務(wù)器端就可以拿到客戶(hù)端輸入的值了。
2)將表單里面提交過(guò)來(lái)的值與ViewState中控件原來(lái)的值進(jìn)行比對(duì),不同則表示要觸發(fā)該控件的Change 事件,則同時(shí)將該控件放到一個(gè)集合(看源碼其實(shí)就是changedPostDataConsumers)中。在后續(xù)執(zhí)行過(guò)程中遍歷改集合依次觸發(fā)對(duì)應(yīng)控件的Change事件。
6.觸發(fā)LoadRecursive()事件
大名鼎鼎的Page_Load就是在這里執(zhí)行的。不過(guò)是先執(zhí)行頁(yè)面本身的Load事件再執(zhí)行頁(yè)面控件的Load事件哦,這時(shí)候前面給控件賦的值,表單提交過(guò)來(lái)的數(shù)據(jù),ViewState等等都可以使用了,IsPostBack的原理就是判斷是否有name為_(kāi)_VIEWSTATE的數(shù)據(jù)提交過(guò)來(lái)
7.再次觸發(fā)ProcessPostData(this._leftoverPostData, false)事件
這個(gè)事件我在網(wǎng)上看了很多人說(shuō)是將第一次遺漏下來(lái)的,第一次執(zhí)行ProcessPostData沒(méi)有涉及到的控件進(jìn)行處理,但是并沒(méi)有說(shuō)明哪些遺漏下來(lái)了。為什么第一次沒(méi)處理了? 最后Google查到是處理我們開(kāi)發(fā)者在頁(yè)面的Page_Load方法中添加的控件。在Page_Load中我們可以自己創(chuàng)建控件對(duì)象加到頁(yè)面對(duì)應(yīng)的“C#DOM樹(shù)中“,如:在Page_Load中寫(xiě)
TextBox txt = new TextBox();txt.ID ="myTxtBox";this.form1.Controls.Add(txt);
這就是把開(kāi)發(fā)者自己創(chuàng)建的控件加在頁(yè)面的form1的表單中。當(dāng)然你也可以加上Change事件了創(chuàng)建控件的時(shí)候。執(zhí)行的還是上面那兩件事了。則回發(fā)的時(shí)候可以給開(kāi)發(fā)者在Page_Lod中手動(dòng)創(chuàng)建的控件還原值。
8.觸發(fā)RaiseChangedEvents事件
循環(huán)遍歷changedPostDataConsumers集合中的所有控件,依次執(zhí)行控件的非點(diǎn)擊回傳事件,比如文本框的改變事件等
9.觸發(fā)RaisePostBackEvent(this._requestValueCollection)事件
執(zhí)行按鈕點(diǎn)擊回傳事件或者驗(yàn)證事件,如果有多個(gè)按鈕,根據(jù)回發(fā)過(guò)來(lái)的按鈕的 name來(lái)判斷觸發(fā)哪個(gè)按鈕的事件,或者觸發(fā)該控件的驗(yàn)證事件
10.觸發(fā)PerformPreRenderComplete事件
循環(huán)遍歷控件樹(shù)中所有的控件,根據(jù)每個(gè)控件生成對(duì)應(yīng)的Html代碼,把服務(wù)器控件渲染成普通的html控件。
11.觸發(fā)事件SaveAllState事件
將服務(wù)器端ViewState集合中的內(nèi)容(開(kāi)發(fā)者自己加的數(shù)據(jù)或控件狀態(tài)信息等)序列化然后Base64編碼然后設(shè)置到客戶(hù)端隱藏域__ViewState中
12.RenderControl(this.CreateHtmlTextWriter(this.Response.Output))
把要發(fā)送到客戶(hù)端瀏覽器的內(nèi)容設(shè)置到Response.Output,應(yīng)用程序?qū)⑺l(fā)送 到客戶(hù)端瀏覽器。[/code]
看到這里不知道大家是否已經(jīng)可以清晰地回答開(kāi)篇提到的幾個(gè)問(wèn)題了,其實(shí)就是這些事件執(zhí)行的先后順序,頁(yè)面生命周期了?!鼻叭酥矘?shù),后人乘涼了"
最后附上生命周期ProcessRequest源碼
private void ProcessRequestMain(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint) { try { HttpContext context = this.Context; string str = null; if (includeStagesBeforeAsyncPoint) { if (this.IsInAspCompatMode) { AspCompatApplicationStep.OnPageStartSessionObjects(); } if (this.PageAdapter != null) { this._requestValueCollection = this.PageAdapter.DeterminePostBackMode(); if (this._requestValueCollection != null) { this._unvalidatedRequestValueCollection = this.PageAdapter.DeterminePostBackModeUnvalidated(); } } else { this._requestValueCollection = this.DeterminePostBackMode(); if (this._requestValueCollection != null) { this._unvalidatedRequestValueCollection = this.DeterminePostBackModeUnvalidated(); } } string callbackControlID = string.Empty; if (this.DetermineIsExportingWebPart()) { if (!RuntimeConfig.GetAppConfig().WebParts.EnableExport) { throw new InvalidOperationException(SR.GetString("WebPartExportHandler_DisabledExportHandler")); } str = this.Request.QueryString["webPart"]; if (string.IsNullOrEmpty(str)) { throw new InvalidOperationException(SR.GetString("WebPartExportHandler_InvalidArgument")); } if (string.Equals(this.Request.QueryString["scope"], "shared", StringComparison.OrdinalIgnoreCase)) { this._pageFlags.Set(4); } string str3 = this.Request.QueryString["query"]; if (str3 == null) { str3 = string.Empty; } this.Request.QueryStringText = str3; context.Trace.IsEnabled = false; } if (this._requestValueCollection != null) { if (this._requestValueCollection["__VIEWSTATEENCRYPTED"] != null) { this.ContainsEncryptedViewState = true; } callbackControlID = this._requestValueCollection["__CALLBACKID"]; if ((callbackControlID != null) && (this._request.HttpVerb == HttpVerb.POST)) { this._isCallback = true; } else if (!this.IsCrossPagePostBack) { VirtualPath path = null; if (this._requestValueCollection["__PREVIOUSPAGE"] != null) { try { path = VirtualPath.CreateNonRelativeAllowNull(DecryptString(this._requestValueCollection["__PREVIOUSPAGE"], Purpose.WebForms_Page_PreviousPageID)); } catch { this._pageFlags[8] = true; } if ((path != null) && (path != this.Request.CurrentExecutionFilePathObject)) { this._pageFlags[8] = true; this._previousPagePath = path; } } } } if (this.MaintainScrollPositionOnPostBack) { this.LoadScrollPosition(); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin PreInit"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_INIT_ENTER, this._context.WorkerRequest); } this.PerformPreInit(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_INIT_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End PreInit"); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin Init"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_INIT_ENTER, this._context.WorkerRequest); } this.InitRecursive(null); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_INIT_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Init"); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin InitComplete"); } this.OnInitComplete(EventArgs.Empty); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End InitComplete"); } if (this.IsPostBack) { if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin LoadState"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_VIEWSTATE_ENTER, this._context.WorkerRequest); } this.LoadAllState(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_VIEWSTATE_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End LoadState"); this.Trace.Write("aspx.page", "Begin ProcessPostData"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_POSTDATA_ENTER, this._context.WorkerRequest); } this.ProcessPostData(this._requestValueCollection, true); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_POSTDATA_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End ProcessPostData"); } } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin PreLoad"); } this.OnPreLoad(EventArgs.Empty); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End PreLoad"); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin Load"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_ENTER, this._context.WorkerRequest); } this.LoadRecursive(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Load"); } if (this.IsPostBack) { if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin ProcessPostData Second Try"); } this.ProcessPostData(this._leftoverPostData, false); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End ProcessPostData Second Try"); this.Trace.Write("aspx.page", "Begin Raise ChangedEvents"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_POST_DATA_CHANGED_ENTER, this._context.WorkerRequest); } this.RaiseChangedEvents(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_POST_DATA_CHANGED_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Raise ChangedEvents"); this.Trace.Write("aspx.page", "Begin Raise PostBackEvent"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RAISE_POSTBACK_ENTER, this._context.WorkerRequest); } this.RaisePostBackEvent(this._requestValueCollection); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RAISE_POSTBACK_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Raise PostBackEvent"); } } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin LoadComplete"); } this.OnLoadComplete(EventArgs.Empty); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End LoadComplete"); } if (this.IsPostBack && this.IsCallback) { this.PrepareCallback(callbackControlID); } else if (!this.IsCrossPagePostBack) { if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin PreRender"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_RENDER_ENTER, this._context.WorkerRequest); } this.PreRenderRecursiveInternal(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_RENDER_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End PreRender"); } } } if ((this._legacyAsyncInfo == null) || this._legacyAsyncInfo.CallerIsBlocking) { this.ExecuteRegisteredAsyncTasks(); } this.ValidateRawUrlIfRequired(); if (includeStagesAfterAsyncPoint) { if (this.IsCallback) { this.RenderCallback(); } else if (!this.IsCrossPagePostBack) { if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin PreRenderComplete"); } this.PerformPreRenderComplete(); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End PreRenderComplete"); } if (context.TraceIsEnabled) { this.BuildPageProfileTree(this.EnableViewState); this.Trace.Write("aspx.page", "Begin SaveState"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_SAVE_VIEWSTATE_ENTER, this._context.WorkerRequest); } this.SaveAllState(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_SAVE_VIEWSTATE_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End SaveState"); this.Trace.Write("aspx.page", "Begin SaveStateComplete"); } this.OnSaveStateComplete(EventArgs.Empty); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End SaveStateComplete"); this.Trace.Write("aspx.page", "Begin Render"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RENDER_ENTER, this._context.WorkerRequest); } if (str != null) { this.ExportWebPart(str); } else { this.RenderControl(this.CreateHtmlTextWriter(this.Response.Output)); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RENDER_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Render"); } this.CheckRemainingAsyncTasks(false); } } } catch (ThreadAbortException exception1) { HttpApplication.CancelModuleException exceptionState = exception1.ExceptionState as HttpApplication.CancelModuleException; if ((((includeStagesBeforeAsyncPoint & includeStagesAfterAsyncPoint) && (this._context.Handler == this)) && ((this._context.ApplicationInstance != null) && (exceptionState != null))) && !exceptionState.Timeout) { this._context.ApplicationInstance.CompleteRequest(); ThreadResetAbortWithAssert(); } else { this.CheckRemainingAsyncTasks(true); throw; } } catch (ConfigurationException) { throw; } catch (Exception exception2) { PerfCounters.IncrementCounter(AppPerfCounter.ERRORS_DURING_REQUEST); PerfCounters.IncrementCounter(AppPerfCounter.ERRORS_TOTAL); if (!this.HandleError(exception2)) { throw; } } } private void ProcessRequestMain(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint) { try { HttpContext context = this.Context; string str = null; if (includeStagesBeforeAsyncPoint) { if (this.IsInAspCompatMode) { AspCompatApplicationStep.OnPageStartSessionObjects(); } if (this.PageAdapter != null) { this._requestValueCollection = this.PageAdapter.DeterminePostBackMode(); if (this._requestValueCollection != null) { this._unvalidatedRequestValueCollection = this.PageAdapter.DeterminePostBackModeUnvalidated(); } } else { this._requestValueCollection = this.DeterminePostBackMode(); if (this._requestValueCollection != null) { this._unvalidatedRequestValueCollection = this.DeterminePostBackModeUnvalidated(); } } string callbackControlID = string.Empty; if (this.DetermineIsExportingWebPart()) { if (!RuntimeConfig.GetAppConfig().WebParts.EnableExport) { throw new InvalidOperationException(SR.GetString("WebPartExportHandler_DisabledExportHandler")); } str = this.Request.QueryString["webPart"]; if (string.IsNullOrEmpty(str)) { throw new InvalidOperationException(SR.GetString("WebPartExportHandler_InvalidArgument")); } if (string.Equals(this.Request.QueryString["scope"], "shared", StringComparison.OrdinalIgnoreCase)) { this._pageFlags.Set(4); } string str3 = this.Request.QueryString["query"]; if (str3 == null) { str3 = string.Empty; } this.Request.QueryStringText = str3; context.Trace.IsEnabled = false; } if (this._requestValueCollection != null) { if (this._requestValueCollection["__VIEWSTATEENCRYPTED"] != null) { this.ContainsEncryptedViewState = true; } callbackControlID = this._requestValueCollection["__CALLBACKID"]; if ((callbackControlID != null) && (this._request.HttpVerb == HttpVerb.POST)) { this._isCallback = true; } else if (!this.IsCrossPagePostBack) { VirtualPath path = null; if (this._requestValueCollection["__PREVIOUSPAGE"] != null) { try { path = VirtualPath.CreateNonRelativeAllowNull(DecryptString(this._requestValueCollection["__PREVIOUSPAGE"], Purpose.WebForms_Page_PreviousPageID)); } catch { this._pageFlags[8] = true; } if ((path != null) && (path != this.Request.CurrentExecutionFilePathObject)) { this._pageFlags[8] = true; this._previousPagePath = path; } } } } if (this.MaintainScrollPositionOnPostBack) { this.LoadScrollPosition(); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin PreInit"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_INIT_ENTER, this._context.WorkerRequest); } this.PerformPreInit(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_INIT_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End PreInit"); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin Init"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_INIT_ENTER, this._context.WorkerRequest); } this.InitRecursive(null); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_INIT_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Init"); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin InitComplete"); } this.OnInitComplete(EventArgs.Empty); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End InitComplete"); } if (this.IsPostBack) { if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin LoadState"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_VIEWSTATE_ENTER, this._context.WorkerRequest); } this.LoadAllState(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_VIEWSTATE_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End LoadState"); this.Trace.Write("aspx.page", "Begin ProcessPostData"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_POSTDATA_ENTER, this._context.WorkerRequest); } this.ProcessPostData(this._requestValueCollection, true); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_POSTDATA_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End ProcessPostData"); } } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin PreLoad"); } this.OnPreLoad(EventArgs.Empty); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End PreLoad"); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin Load"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_ENTER, this._context.WorkerRequest); } this.LoadRecursive(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Load"); } if (this.IsPostBack) { if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin ProcessPostData Second Try"); } this.ProcessPostData(this._leftoverPostData, false); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End ProcessPostData Second Try"); this.Trace.Write("aspx.page", "Begin Raise ChangedEvents"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_POST_DATA_CHANGED_ENTER, this._context.WorkerRequest); } this.RaiseChangedEvents(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_POST_DATA_CHANGED_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Raise ChangedEvents"); this.Trace.Write("aspx.page", "Begin Raise PostBackEvent"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RAISE_POSTBACK_ENTER, this._context.WorkerRequest); } this.RaisePostBackEvent(this._requestValueCollection); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RAISE_POSTBACK_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Raise PostBackEvent"); } } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin LoadComplete"); } this.OnLoadComplete(EventArgs.Empty); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End LoadComplete"); } if (this.IsPostBack && this.IsCallback) { this.PrepareCallback(callbackControlID); } else if (!this.IsCrossPagePostBack) { if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin PreRender"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_RENDER_ENTER, this._context.WorkerRequest); } this.PreRenderRecursiveInternal(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_RENDER_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End PreRender"); } } } if ((this._legacyAsyncInfo == null) || this._legacyAsyncInfo.CallerIsBlocking) { this.ExecuteRegisteredAsyncTasks(); } this.ValidateRawUrlIfRequired(); if (includeStagesAfterAsyncPoint) { if (this.IsCallback) { this.RenderCallback(); } else if (!this.IsCrossPagePostBack) { if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin PreRenderComplete"); } this.PerformPreRenderComplete(); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End PreRenderComplete"); } if (context.TraceIsEnabled) { this.BuildPageProfileTree(this.EnableViewState); this.Trace.Write("aspx.page", "Begin SaveState"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_SAVE_VIEWSTATE_ENTER, this._context.WorkerRequest); } this.SaveAllState(); if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_SAVE_VIEWSTATE_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End SaveState"); this.Trace.Write("aspx.page", "Begin SaveStateComplete"); } this.OnSaveStateComplete(EventArgs.Empty); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End SaveStateComplete"); this.Trace.Write("aspx.page", "Begin Render"); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RENDER_ENTER, this._context.WorkerRequest); } if (str != null) { this.ExportWebPart(str); } else { this.RenderControl(this.CreateHtmlTextWriter(this.Response.Output)); } if (EtwTrace.IsTraceEnabled(5, 4)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RENDER_LEAVE, this._context.WorkerRequest); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Render"); } this.CheckRemainingAsyncTasks(false); } } } catch (ThreadAbortException exception1) { HttpApplication.CancelModuleException exceptionState = exception1.ExceptionState as HttpApplication.CancelModuleException; if ((((includeStagesBeforeAsyncPoint & includeStagesAfterAsyncPoint) && (this._context.Handler == this)) && ((this._context.ApplicationInstance != null) && (exceptionState != null))) && !exceptionState.Timeout) { this._context.ApplicationInstance.CompleteRequest(); ThreadResetAbortWithAssert(); } else { this.CheckRemainingAsyncTasks(true); throw; } } catch (ConfigurationException) { throw; } catch (Exception exception2) { PerfCounters.IncrementCounter(AppPerfCounter.ERRORS_DURING_REQUEST); PerfCounters.IncrementCounter(AppPerfCounter.ERRORS_TOTAL); if (!this.HandleError(exception2)) { throw; } } }
以上就是關(guān)于ASP.NET頁(yè)面生命周期的詳細(xì)內(nèi)容介紹,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
強(qiáng)烈推薦一個(gè)基于.Net Framework開(kāi)發(fā)的Windows右鍵菜單管理工具
這篇文章主要介紹了推薦一個(gè)基于.Net Framework開(kāi)發(fā)的Windows右鍵菜單管理工具,今天給大家推薦一個(gè)Windows右鍵菜單管理工具,方便我們管理我們的右鍵菜單,需要的朋友可以參考下2023-05-051個(gè)文件如何輕松搞定Asp.net core 3.1動(dòng)態(tài)頁(yè)面轉(zhuǎn)靜態(tài)頁(yè)面
這篇文章主要給大家介紹了關(guān)于如何通過(guò)1個(gè)文件輕松搞定Asp.net core 3.1動(dòng)態(tài)頁(yè)面轉(zhuǎn)靜態(tài)頁(yè)面的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Asp.net core 3.1具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05asp.net 動(dòng)態(tài)創(chuàng)建TextBox控件及狀態(tài)數(shù)據(jù)如何加載
接著上文Asp.net TextBox的TextChanged事件你真的清楚嗎?這里我們來(lái)說(shuō)說(shuō)狀態(tài)數(shù)據(jù)時(shí)如何加載的,需要的朋友可以參考下2012-12-12.net6?在中標(biāo)麒麟下的安裝和部署過(guò)程
這篇文章主要介紹了.net6?在中標(biāo)麒麟下的安裝部署,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Asp.net core利用MediatR進(jìn)程內(nèi)發(fā)布/訂閱詳解
這篇文章主要給大家介紹了關(guān)于Asp.net core利用MediatR進(jìn)程內(nèi)發(fā)布/訂閱的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Asp.net core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06淺談.Net Core 認(rèn)證系統(tǒng)源碼解析
這篇文章主要介紹了淺談.Net Core 認(rèn)證系統(tǒng)源碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12