控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

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

作者:小洋 出处:博客园 2010年01月27日 阅读:

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

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

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


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

 
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开发的方法)。相信大家应该明白了,其实页面的生命周期就是一个个方法的调用过程。(本文由控件中国网转载)

 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统