• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 详解ASP.NET页面生命周期

详解ASP.NET页面生命周期

作者:少林无名扫地僧 字体:[增加 减小] 来源:互联网 时间:2017-05-11

少林无名扫地僧通过本文主要向大家介绍了页面跳转 asp.net,阐述asp.net页面模型,asp net培训,asp.net,北京asp.net编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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;

}

</div>

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;
 }
}
</div>

主要做了两件事

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事件了创建控件的时候。执行的还是上面那两件事了。则回

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ASP.NET使用ajax实现分页局部刷新页面功能
  • ASP.NET实现个人信息注册页面并跳转显示
  • Asp.net中阻止页面按钮多次提交的解决办法
  • 在ASP.NET Core中显示自定义的错误页面
  • ASP.NET实现个人信息注册页面并跳转显示
  • ASP.NET页面缓存常见的4种方式
  • Asp.net页面中调用soapheader进行验证的操作步骤
  • ASP.NET中防止页面刷新造成表单重复提交执行两次操作
  • asp.net采集页面上所有图像图片资源的具体方法
  • 详解ASP.NET页面生命周期

相关文章

  • 2017-05-11.net开发微信公众平台实例教程
  • 2017-05-11asp.net 通用分页显示辅助类(改进版)
  • 2017-05-11asp.net coolite 删除时弹出确定按钮
  • 2017-05-11.net自带的库生成zip文件的方法
  • 2017-05-11ASP.NET MVC4 HtmlHelper扩展类,实现分页功能
  • 2017-05-11ASP.NET使用xslt将xml转换成Excel
  • 2017-05-11Asp.net ajax实现任务提示页面的简单代码
  • 2017-05-11Asp.net mvc实时生成缩率图到硬盘
  • 2017-05-11asp.net 在处理向该请求提供服务所需的配置文件时出错
  • 2017-05-11使用asp.net的pageDataSource中时索引问题解决方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ajaxToolkit:ModalPopupExtender演示及实现代码
    • asp.net中生成缩略图并添加版权实例代码
    • ASP.NET设计FTP文件上传的解决方案
    • GridView选择记录同时confirm用户确认删除
    • 服务端拼接json数据格式的正确写法(Append方式)
    • asp.net下获取远程网页的内容之二(downmoon原创)
    • ASP.NET中实现Form表单字段值自动填充到操作模型中
    • ASP.NET MVC中分部视图的应用方法
    • ASP.NET搭配Ajax实现搜索提示功能
    • asp.net(c#)中取得文件物理路径

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有