详解ASP.NET页面生命周期

ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤。包括初始化、实例化控件、还原和维护状态、运行时间处理程序代码以及进行呈现。熟悉页面生命周期非常重要,这样我们才能在生命周期的合适阶段编写代码。如果我们能在写代码的时候想着我们现在是在做生命周期的哪一步那将是非常好的。

几个代表性的问题

在开始的时候我们先思考几个问题,看看我们在描述完页面生命周期的时候,能不能回答上这几个问题

  • 1.为什么在服务器端能通过this.textbox1.Text获取到用户提交过来的数据?
  • 2.在Page_Load中Response.Write("hello")查看生成的html代码原文件,hello在哪里?为什么?
  • 3.有一个服务器端的按钮,设置了点击事件,该点击事件什么时候执行?是先执行Page_Load事件还是先执行点击事件?
  • 4.为什么在服务器端通过this.textbox1.Text设置值后,客户端就能显示出来?

了解ASP.NET请求管道、应用程序生命周期、整体运行机制童鞋可能知道,ASP.NET应用程序周期中PreRequestHandlerExecute事件与PostRequestHandlerExecute事件之间就是我们的页面生命周期了,对于aspx页面就是一系列的打造页面控件树,触发各种页面时间,对于一般处理程序ashx就是直接执行咱们开发者写的ProcessRequest方法了,对于MVC应用程序就是创建控制器工厂,创建控制器对象,调用Action那一套了。

下面主要讲述的就是ASP.NET WebForm中的页面的生命周期了。

我们用反编译工具查看Page类的ProcessRequest方法可以看见先调用了FrameworkInitialize; FrameworkInitialize里面就是打造了页面控件树,然后调用了ProcessRequestMain,就开始了执行整个页面生命周期了(其实就是调用了一系列的事件方法)(可能部分图看不见右边,可在新标签页中打开图片)

1.打造页面控件树

FrameworkInitialize内部调用了_buildControlTree()方法


  

上图中左边是前台页面的代码,右边是对应 生成的打造控件树的代码。中间截取的是生成表单那一部分的代码。

下面看一张原理图

  浏览器的DOM树是根据Html标签生成一个C语言的DOM树,而ASP.NET服务器端是用C#打造的一个控件树,也是按照DOM结构打造的。本质是一样。服务器端所有东西都加到页面对象的控件集合中去了。标签在服务器端有对应的控件对象的时候就用控件对象,没有的时候就使用LiteralControl进行封装。不管是服务器控件还是字符串标签(没有runat="server"的标签)都以控件对象的方式存在前台页面类的控件集合里面。好处就是生成前台页面的html代码的时候,只需要遍历控件集合里面的每一个控件对象的RenderControl方法,每一个控件都会调用自己的Render方法生成对应的Html字符串。那么所有控件的生成的html字符串就还原成一个页面的html代码了。  

2.触发PerformPreInit事件 

在所有初始化之前初始化了这个事件,这个事件主要是初始化了主题,初始化了母版页

private void PerformPreInit()

{

 this.OnPreInit(EventArgs.Empty);

 this.InitializeThemes();

 this.ApplyMasterPage();

 this._preInitWorkComplete = true;

}

3.触发InitRecursive事件

4.触发LoadAllState()事件

加载页面状态解析ViewState,将页面表单中的ViewState进行反Base64编码,反序列化,存在页面的ViewState属性中

5.触发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)将表单里提交过来的控件数据设置给页面对象的控件树中对应控件的属性(给前面打造的控件树里面控件给值),这样在服务器端就可以拿到客户端输入的值了。

2)将表单里面提交过来的值与ViewState中控件原来的值进行比对,不同则表示要触发该控件的Change 事件,则同时将该控件放到一个集合(看源码其实就是changedPostDataConsumers)中。在后续执行过程中遍历改集合依次触发对应控件的Change事件。

6.触发LoadRecursive()事件

大名鼎鼎的Page_Load就是在这里执行的。不过是先执行页面本身的Load事件再执行页面控件的Load事件哦,这时候前面给控件赋的值,表单提交过来的数据,ViewState等等都可以使用了,IsPostBack的原理就是判断是否有name为__VIEWSTATE的数据提交过来
7.再次触发ProcessPostData(this._leftoverPostData, false)事件

这个事件我在网上看了很多人说是将第一次遗漏下来的,第一次执行ProcessPostData没有涉及到的控件进行处理,但是并没有说明哪些遗漏下来了。为什么第一次没处理了? 最后Google查到是处理我们开发者在页面的Page_Load方法中添加的控件。在Page_Load中我们可以自己创建控件对象加到页面对应的“C#DOM树中“,如:在Page_Load中写
TextBox txt = new TextBox();txt.ID ="myTxtBox";this.form1.Controls.Add(txt);
这就是把开发者自己创建的控件加在页面的form1的表单中。当然你也可以加上Change事件了创建控件的时候。执行的还是上面那两件事了。则回发的时候可以给开发者在Page_Lod中手动创建的控件还原值。

8.触发RaiseChangedEvents事件

循环遍历changedPostDataConsumers集合中的所有控件,依次执行控件的非点击回传事件,比如文本框的改变事件等      

9.触发RaisePostBackEvent(this._requestValueCollection)事件

执行按钮点击回传事件或者验证事件,如果有多个按钮,根据回发过来的按钮的 name来判断触发哪个按钮的事件,或者触发该控件的验证事件
10.触发PerformPreRenderComplete事件

循环遍历控件树中所有的控件,根据每个控件生成对应的Html代码,把服务器控件渲染成普通的html控件。

11.触发事件SaveAllState事件

将服务器端ViewState集合中的内容(开发者自己加的数据或控件状态信息等)序列化然后Base64编码然后设置到客户端隐藏域__ViewState中

12.RenderControl(this.CreateHtmlTextWriter(this.Response.Output))

把要发送到客户端浏览器的内容设置到Response.Output,应用程序将它发送 到客户端浏览器。[/code]

看到这里不知道大家是否已经可以清晰地回答开篇提到的几个问题了,其实就是这些事件执行的先后顺序,页面生命周期了。”前人植树,后人乘凉了"

最后附上生命周期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;
 }
 }
}

以上就是关于ASP.NET页面生命周期的详细内容介绍,希望对大家的学习有所帮助。

(0)

相关推荐

  • 详解ASP.NET页面生命周期事件

    下面是ASP.NET页面初始的过程:1. Page_Init();2. Load ViewState;3. Load Postback data;4. Page_Load();5. Handle control events;6. Page_PreRender();7. Page_Render();8. Unload event;9. Dispose method called; 下面对其中的一些过程作下描述:1. Page_Init();这个过程主要是初始化控件,每次页面载入执行这个初始过程,

  • 深入理解Asp.Net中WebForm的生命周期

    前言 本文主要给大家介绍的是关于Asp.Net中WebForm生命周期的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 一.Asp.Net页面生命周期的概念 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端IIS)发送一个request请求,服务器就会判断发送过来的请求页面,当完全识别 TTP页面处理程序类后,ASP.NET运行时将调用处理程序的 ProcessRequest 方法来处理请求.创建页面对象.通常情况下,无需更改此方法的实现,因为它是由 Page 类提供的

  • ASP.NET Web页生命周期和执行的方法介绍

    以上所列的阶段中有些在页面级是不可见的,并且仅对服务器控件的编写者和要创建从 Page 导出的类的开发人员有意义.Init.Load.PreRender.Unload,再加上由嵌入式控件定义的所有回发事件,就构成了向外发送页面的各个阶段标记. 执行的各个阶段 页面生命周期中的第一个阶段是初始化.这个阶段的标志是 Init 事件.在成功创建页面的控件树后,将对应用程序触发此事件.换句话说,当 Init 事件发生时,.aspx 源文件中静态声明的所有控件都已实例化并采用各自的默认值.控件可以截取 I

  • IIS处理Asp.net请求和Asp.net页面生命周期说明

    首先我们要弄清楚两个非常重要的概念: 1, worker process(w3wp.exe). worker process管理所有的来自客户端的请求并给出响应.它是IIS下asp.net应用程序的核心. 2, application pool. 它是worker process的容器,IIS5及之前的IIS版本均没有application pool的概念.每一个application pool对应着一个worker process,在IIS Metabase中维护着Application Po

  • asp.net页面生命周期详解

    Asp.net是微软.Net战略的一个组成部分.它相对以前的Asp有了很大的发展,引入了许多的新机制.本文就Asp.net页面的生命周期向大家做一个初步的介绍,以期能起到指导大家更好.更灵活地操纵Asp.net的作用.当一个获取网页的请求(可能是通过用户提交完成的,也可能是通过超链接完成的)被发送到Web服务器后,这个页面就会接着运行从创建到处理完成的一系列事件.在我们试图建立Asp.net页面的时候,这个执行周期是不必去考虑的,那样只会自讨苦吃.然而,如果被正确的操纵,一个页面的执行周期将是一

  • IIS处理Asp.net请求和Asp.net页面生命周期详细说明

    ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件处理程序代码以及进行呈现.了解页生命周期非常重要,因为这样做您就能在生命周期的合适阶段编写代码,以达到预期效果.此外,如果您要开发自定义控件,就必须熟悉页生命周期,以便正确进行控件初始化,使用视图状态数据填充控件属性以及运行任何控件行为代码.(控件的生命周期基于页的生命周期,但是页引发的控件事件比单独的 ASP.NET 页中可用的事件多.) 一般来说,页要经

  • 验证一个ASP.NET应用程序和页面的生命周期的实现代码

    如果我们能更好地掌握这样一个过程,那么对单个ASP.NET Page的生命周期也能更好地了解: 下面介绍如何编写一个简单的ASP.NET 页面和一个简单的HttpModule,对MSDN里提到的ASP.NET的生命周期进行验证 1. 首先使用Visual Studio 2010建立一个空的ASP.NET网站 (ASP.NET 4.0) 2. 添加一个Default.aspx,添加三个ASP.NET控件,分别为TextBox,Button和Validator: 复制代码 代码如下: <form i

  • ASP.NET服务器控件的生命周期分析

    本文实例分析了ASP.NET服务器控件的生命周期.分享给大家供大家参考.具体如下: (1)初始化----在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置:二.跟踪视图状态.首先,页面框架通过默认方式引发Init事件,并调用OnInit()方法,控件开发人员可以重写该方法为控件提供初始化逻辑.此后,页面框架将调用TrackViewState方法来跟踪视图状态.需要注意的是:多数情况下,Control基类提供的TrackViewState方法实现已经足够了.只有在控件定义

  • 详解ASP.NET页面生命周期

    ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我们才能在生命周期的合适阶段编写代码.如果我们能在写代码的时候想着我们现在是在做生命周期的哪一步那将是非常好的. 几个代表性的问题 在开始的时候我们先思考几个问题,看看我们在描述完页面生命周期的时候,能不能回答上这几个问题 1.为什么在服务器端能通过this.textbox1.Text获取到用户提交过来的数

  • ASP.Net页面生命周期与Page_Load方法的工作原理介绍

    一.ASP.Net Web应用程序中的请求处理过程 二. http模块生命周期: 三.Asp.NET页面生命周期 1.阶段 阶段 说明 请求页面(Page Request) 严格地说,这个阶段不是页面生命周期的一部分.而是页面生命周期之前的一个阶段.Asp.NET接收到一个页面请求之后,执行分析和编译页面的工作或者从缓存中取出该页面发送给客户端. 开始(Start) 在这个阶段,Asp.NET设置Page对象的Request和Response属性:确定该页面请求是否为PostBack:给页面设置

  • 详解C++作用域与生命周期

    Pascal之父Nicklaus Wirth曾经提出一个公式,展示出了程序的本质:程序=算法+数据结构.后人又给出一个公式与之遥相呼应:软件=程序+文档.这两个公式可以简洁明了的为我们展示程序和软件的组成. 程序的运行过程可以理解为算法对数据的加工过程,程序的运行的结果,就是算法加工数据产生的结果数据.算法描述的是对数据加工的步骤,对应于程序中的函数.数据结构描述的是数据在计算机中的组织结构,对应于程序中的数据类型.程序中数据对应的就是无处不在变量.对于我们编程人员,面对的无非就是函数,数据类型

  • 详解Angular组件之生命周期(二)

    一.view钩子 view钩子有2个,ngAfterViewInit和ngAfterViewChecked钩子. 1.实现ngAfterViewInit和ngAfterViewChecked钩子时注意事项 以父组件调用子组件方法中例子为基础,在父组件中实现ngAfterViewInit和ngAfterViewChecked钩子. 这两个钩子是在组件的模版所有内容组装完成后,组件模版已经呈现给用户看了,之后这两个钩子方法会被调用. @ViewChild('child1') child1:Child

  • 详解ASP.NET 页面之间传值的几种方式

    开篇概述 对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有3-5年经验的,有5-10年经验的,对于所有的面试者,我几乎问了同一道题:"请说说你所知道的页面之间传值的几种形式和方法,并阐述他们的原理和过程",关于这道题,从大家的回答来看,结果并不是很理想,从种类上来说,大部分人回答5种左右,极少部分能回答8种,没有超过8种的,但从深度上来说,很少有

  • 详解ES6 Promise的生命周期和创建

    一:Promise的概念 Promise的中文意思是'承诺',什么叫承诺?承诺就是现在没有发生,在将来的某个时刻一定会发生的事情. 放在编程语言的环境下,Promise就是异步事件的结果的占位符.我们不用去管异步事件的结果什么时候来,只需要关心异步事件的结果产生的时候,你想要做什么就对了. 二:Promise的生命周期 异步事件不是立即执行程序,它的结果可能要在动作发生后一段时间才到,所以它有个生命周期.例如用电饭锅煮米饭,从[米下锅开始定时]到[定时结束],这是煮米饭的生命周期. 一个Prom

随机推荐