浅谈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 ,如下:

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方法就知道了:(大家只要随便扫一下下面的代码就行了)

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开发的方法)。相信大家应该明白了,其实页面的生命周期就是一个个方法的调用过程。
下面就是方法执行的图解:

大家可以对照方法从上往下看,因为很多的文章都已经详细的介绍了每个方法的作用,我这里不再赘述,如果大家需要的话就说下.
今天到这里。谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库