浅谈ASP.NET内部机制(五)

本文详细解析了ASP.NET页面的生命周期,包括从请求处理到页面渲染的整个过程。重点介绍了页面生命周期中的关键阶段及其作用,有助于理解ASP.NET应用程序的工作原理。

                                                  浅谈ASP.NET内部机制(五)

     前言:本章要谈页面生命周期了,过程挺多的,但是一点都不难。不信可以看看。我尽量的讲的平实一些,而且理解页面的生命周期对喜欢开发自定义控件和组件的朋友是很有帮助的。

 

系列文章链接:

浅谈ASP.NET的内部机制(一)

浅谈ASP.NET的内部机制(二)

浅谈ASP.NET内部机制(三)

浅谈ASP.NET内部机制(四)

浅谈ASP.NET内部机制(五)

浅谈ASP.NET内部机制(六)

浅谈ASP.NET内部机制(七)

浅谈ASP.NET内部机制(八)

 

     页面生命周期,也就是处理一个页面请求的过程。我们之前就说过了的,不同文件的由不同的处理程序来处理。而且处理程序都是实现了IHttpHandler接口。这个接口中有两个方法,其中真正用来处理请求的就是ProcessRequest方法。

 

     所以当我们请求一个页面的时候,我们的页面,假如我们请求的是default.aspx这个页面是继承自Page,大家应该知道在程序运行的时候default.aspx以及它的.cs代码部分一起被编译成为default_aspx   ,如下:

     

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace ASP
{
  
public class default_aspx : Page
  {
  
protected ScriptManager ScriptManager1;
  
protected TextBox TextBox1;
  
protected Button Button1;
  
protected Label Info;
  
protected UpdatePanel UpdatePanel1;
  
protected HtmlForm form1;

  
private UpdatePanel @__BuildControlUpdatePanel1()
  {
  . . .
  }

  
private HtmlForm @__BuildControlform1()
  {
   . . .
  }
  
  
private void @__BuildControlTree(default_aspx   @__ctrl)
 {
   IParserAccessor @__parser 
= ((IParserAccessor) (@__ctrl));
  @__parser.AddParsedSubObject(
  
new LiteralControl(“<html   xmlns=\”http://www.w3.org/1999/xhtml\”>”));
@__parser.AddParsedSubObject(new LiteralControl(“\r\n<body>\r\n “));
HtmlForm @__ctrl2 
= this.@__BuildControlform1();
@__parser.AddParsedSubObject(@__ctrl2);
@__parser.AddParsedSubObject(
new LiteralControl(“\r\n</body>\r\n</html>\r\n”));
}

  
protected override void FrameworkInitialize()
  {
   
base.FrameworkInitialize();
   
this.@__BuildControlTree(this);
  }
 }
}

 

          因为我们的请求是请求的上面的那个default.aspx页面,也就是说我们请求的文件是以.aspx结尾的。而恰好以.aspx文件结果的处理程序是由Page来处理的,因为Page类实现了IHttpHandler.所以就是这里比较特殊,很多人都在这里糊涂过。因为default_aspx继承Page,所以请求defult.aspx的请求实际上是由default_aspx类的实例来处理的。这里讲点的有点绕,大家见谅。讲的更加通俗点基本上可以这么认为“自己处理自己”(这个说法很不严格,只是希望大家加深理解)。

     其实处理的过程就是所谓的页面生命周期,说白了也就是处理的流程,大家看看下面Page类的ProcessRequest方法就知道了:(大家只要随便扫一下下面的代码就行了)

     

 

ContractedBlock.gif ExpandedBlockStart.gif Code
public void ProcessRequest(HttpContext context)
{
  
this._context = context;

  
this.RetrievePostedData();

  
if (this.MaintainScrollPositionOnPostBack)
  
this.LoadScrollPosition();
  
this.PerformPreInit();
  
this.InitRecursive(null);
  
this.OnInitComplete(EventArgs.Empty);
  
if (this.IsPostBack)
  {
  
this.LoadAllState();
  
this.ProcessPostData(this._requestValueCollection, true);
  }
  
this.OnPreLoad(EventArgs.Empty);
  
this.LoadRecursive();
  
if (this.IsPostBack)
  {
  
this.ProcessPostData(this._leftoverPostData, false);
  
this.RaiseChangedEvents();
  
this.RaisePostBackEvent this._requestValueCollection);
  }
  
this.OnLoadComplete(EventArgs.Empty);
  
this.PreRenderRecursive();
  
this.PerformPreRenderComplete();
  
this.SaveAllState();
  
this.OnSaveStateComplete(EventArgs.Empty);
  
this.RenderControl(this.CreateHtmlTextWriter (this.Response.Output));
}

 

          上面的代码,是不是有我们很熟悉的部分,如Init事件的触发方法,Load事件的触发方法(都是以On开发的方法)。相信大家应该明白了,其实页面的生命周期就是一个个方法的调用过程。

          下面就是方法执行的图解:

          

     

          大家可以对照方法从上往下看,因为很多的文章都已经详细的介绍了每个方法的作用,我这里不再赘述,如果大家需要的话就说下.

     今天到这里。谢谢!

 

转载于:https://www.cnblogs.com/yanyangtian/archive/2009/03/07/1405663.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值