We know that the page is a processing program, and the implementation in it is very complicated. There is also a lot of information on the Internet about the asp.net pipeline processing, and there are also a lot of page-related event processing; here I will view the page event processing result
The summary here comes to asp.net. We also know that page processing is concentrated in a ProcessRequest method. This method ultimately calls the ProcessRequestMain method. The main implementation is as follows:
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"); } this.PerformPreInit(); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End PreInit"); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "Begin Init"); } this.InitRecursive(null); 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"); } this.LoadAllState(); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End LoadState"); this.Trace.Write("aspx.page", "Begin ProcessPostData"); } this.ProcessPostData(this._requestValueCollection, true); 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"); } this.LoadRecursive(); 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"); } this.RaiseChangedEvents(); if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Raise ChangedEvents"); this.Trace.Write("aspx.page", "Begin Raise PostBackEvent"); } this.RaisePostBackEvent(this._requestValueCollection); 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"); } this.PreRenderRecursiveInternal(); 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"); } this.SaveAllState(); 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 (str != null) { this.ExportWebPart(str); } else { this.RenderControl(this.CreateHtmlTextWriter(this.Response.Output)); } if (context.TraceIsEnabled) { this.Trace.Write("aspx.page", "End Render"); } this.CheckRemainingAsyncTasks(false); } } } catch (ConfigurationException) { throw; } }
Two sections of code are interesting in this method.
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 ");
}
This. LoadAllState ();
If (context. TraceIsEnabled)
{
This. Trace. Write ("aspx. page", "End LoadState ");
This. Trace. Write ("aspx. page", "Begin ProcessPostData ");
}
This. ProcessPostData (this. _ requestValueCollection, true );
If (context. TraceIsEnabled)
{
This. Trace. Write ("aspx. page", "End ProcessPostData ");
}
}
If (context. TraceIsEnabled)
{
This. Trace. Write ("aspx. page", "Begin PreLoad ");
}
This. OnPreLoad (EventArgs. Empty );
And
This. LoadRecursive ();
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 ");
}
This. RaiseChangedEvents ();
If (context. TraceIsEnabled)
{
This. Trace. Write ("aspx. page", "End Raise ChangedEvents ");
This. Trace. Write ("aspx. page", "Begin Raise PostBackEvent ");
}
This. RaisePostBackEvent (this. _ requestValueCollection );
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 );
Compared with get, the post-based requests are processed more in the middle. We also know that when processing the post request, page needs to process the loading IPostBackDataHandler of data and trigger IPostBackEventHandler of the event.
Therefore, it is easier to understand why we divide the data into two segments.
Their introduction is as follows: