浅谈ASP.NET内部机制(五)
\n
前言:本章要谈页面生命周期了,过程挺多的,但是一点都不难。不信可以看看。我尽量的讲的平实一些,而且理解页面的生命周期对喜欢开发自定义控件和组件的朋友是很有帮助的。
\n
页面生命周期,也就是处理一个页面请求的过程。我们之前就说过了的,不同文件的由不同的处理程序来处理。而且处理程序都是实现了IHttpHandler接口。这个接口中有两个方法,其中真正用来处理请求的就是ProcessRequest方法。
\n
所以当我们请求一个页面的时候,我们的页面,假如我们请求的是default.aspx这个页面是继承自Page,大家应该知道在程序运行的时候default.aspx以及它的.cs代码部分一起被编译成为default_aspx ,如下:
\n
\n
Code
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
\n
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;
\n
private UpdatePanel @__BuildControlUpdatePanel1()
{
. . .
}
\n
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”));
}
\n
protected override void FrameworkInitialize()
{
base.FrameworkInitialize();
this.@__BuildControlTree(this);
}
}
}
\n
因为我们的请求是请求的上面的那个default.aspx页面,也就是说我们请求的文件是以.aspx结尾的。而恰好以.aspx文件结果的处理程序是由Page来处理的,因为Page类实现了IHttpHandler.所以就是这里比较特殊,很多人都在这里糊涂过。因为default_aspx继承Page,所以请求defult.aspx的请求实际上是由default_aspx类的实例来处理的。这里讲点的有点绕,大家见谅。讲的更加通俗点基本上可以这么认为“自己处理自己”(这个说法很不严格,只是希望大家加深理解)。
\n
其实处理的过程就是所谓的页面生命周期,说白了也就是处理的流程,大家看看下面Page类的ProcessRequest方法就知道了:(大家只要随便扫一下下面的代码就行了)
\n
Code
public void ProcessRequest(HttpContext context)
{
this._context = context;
\n
this.RetrievePostedData();
\n
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));
}
\n
上面的代码,是不是有我们很熟悉的部分,如Init事件的触发方法,Load事件的触发方法(都是以On开发的方法)。相信大家应该明白了,其实页面的生命周期就是一个个方法的调用过程。
\n
下面就是方法执行的图解:
\n
\n
\n
大家可以对照方法从上往下看,因为很多的文章都已经详细的介绍了每个方法的作用,我这里不再赘述,如果大家需要的话就说下.
\n
今天到这里。谢谢!
\n
来源:http://www.cnblogs.com/yanyangtian
\n\n