介绍
Asp.net是微软.Net战略的一个组成部分。它相对以前的Asp有了很大的发展,引入了许多的新机制。本文就Asp.net页面的生命周期向大家做一个初步的介绍,以期能起到指导大家更好、更灵活地操纵Asp.net的作用。
当一个获取网页的请求(可能是通过用户提交完成的,也可能是通过超链接完成的)被发送到Web服务器后,这个页面就会接着运行从创建到处理完成的一系列事件。在我们试图建立Asp.net页面的时候,这个执行周期是不必去考虑的,那样只会自讨苦吃。然而,如果被正确的操纵,一个页面的执行周期将是一道有效而且功能强大的工具。许多开发者在编写Asp.net的页面以及用户控件的时候发现,如果知道整个过程中发生了什么以及在什么时候发生将对完成整个任务起到很重要的帮助作用。下面我就向大家介绍一下一个Asp.net页面从创建到处理完成过程中的十个事件。同时,也向大家展示如何在这些事件中添加自己的代码以达到预定的效果。
一.初始化对象
一个页面的控件(以及页面本身)最初应被正确的初始化。通过在你的C#文件的构造函数中声名所有对象(如图1),页面就知道要创建多少对象以及它们的类型。一旦你在你的构造函数中声名了所有的对象,你就可以通过继承类、方法、事件或是属性访问它们。然而,如果你的一些对象是在Aspx文件中指定的一些控件,那么这些控件就没有属性可言了。同时,通过代码访问它们会产生一些意外的错误,因为这些控件实例是没有一个确定的创建顺序的(如果它们是被一起创建的)。还有,你可以通过OnInit来重载初始化事件,图示如下(图1):

图1

二.导入Viewstate数据
在初始化事件后,所有控件只可以通过它们的ID被引用访问(因为还没有相应的DOM可使用)。在LoadViewState这个事件中,所有的控件将获得它们的第一个属性:Viewstate属性。这个属性最终将被返回给服务器以判断这个页面是已经被用户访问完毕还是仍然在被用户所访问。Viewstate属性以“名称/值”对的字符串方式被保存,它包含了控件的文本以及值等信息。该属性被存储在一个隐藏的<input>控件的值属性里,在请求页面时被传递。这种方式比起Asp3.0的维持、判断页面状态的方式有了很大的进步啊。还有,你可以重载LoadViewState事件函数来对相应的控件进行值设定。下图(图2)是一个例子:

图2

三.用LoadPostData处理Postback数据
在页面创建的这个阶段,服务器对页面上的控件提交的表单数据(在Asp.net中称postback数据)进行处理。当一个页面提交一个表单时,框架就在每个提交了数据的控件上执行一个IPostBackDataHandler接口操作。然后页面执行LoadPostData事件,解析页面,找到每个执行了IpostBackDataHandler接口操作的控件,并用恰当的postback数据更新这些控件状态。Asp.net是通过用NameValue集中的“名称/值”对和每个控件的唯一的ID匹配来实现这一操作的。所以,在Asp.net的页面上每个控件必须有一个唯一的ID,不可以出现几个控件共有ID的情况。即使是用户自定义的一些控件,框架也会赋予它们各自唯一的ID的。在LoadPostData事件后,就要执行下面的RaisePostDataChanged事件了。
四.导入对象
在Load事件中,对象都实例化了。所有的对象第一次被布置在DOM页面(在Asp.net中称控件树)里了并且可以通过代码或是相关的位置被引用。这样,对象就可以很容易的从客户端获得诸如宽度、高度、值、可见性等在Html中的属性值。在Load事件中,当然还有像设置控件属性等操作的发生。这个过程是整个生命周期中最重要、最主要的,你可以通过调用OnLoad来重载Load事件,图示如下(图3):

图3

五.RaisePostBackChanged事件
就像在上面提到的那样,这个事件是发生在所有的控件执行了IPostBackDataHandler接口操作并被正确的postback数据更新后的。在这个过程中,每个控件都被赋予一个布尔值来标志该控件有没有被更新。然后,Asp.net就在整个页面上寻找任何已被更新过的控件并执行RaisePostDataChanged事件操作。不过,这个事件是要在所有的控件都被更新了以及Load事件完成后才进行的。这样就保证了一个控件在被postback数据更新前,别的控件在RaisePostDataChanged事件中是不会被手动改变的。
六.处理客户端PostBack事件
当由postback数据在服务器端引起的事件都完成后,产生postback数据的对象就执行RaisePostBackEvent事件操作。可是会有这种情况,由于一个控件状态的改变使得它将表单返回给服务器或是用户点击了提交按钮使得表单返回给服务器。在这种情况下应该有相应的处理代码来体现事件驱动这一面向对象(OOP)编程原则。由于要满足呈现给浏览器的数据的精确性要求,在一系列postback事件中RaisePostBackEvent事件是最后发生的。
在postback过程中改变的控件不应在执行功能函数被调用后更新。也就是说,任何由于一个预期的事件而改变的数据应该在最终的页面上被反映出来。你可以通过修改RaisePostBackEvent函数来满足你的要求,图示如下(图4):

图4

七.预先呈递对象
可以改变对象并将改变保存的最后时刻就是这一步――预先呈递对象。这样,你可以在这一步对控件的属性、控件树结构等作出最后的修改。同时还不用考虑Asp.net对其作出任何改变,因为此时已经脱离了数据库调用以及viewstate更新了。在这一步之后,对对象的所有修改将最终被确定,不能被保存到页面的viewstate中了。你可以通过OnPreRender来重载这一步。
八.保存ViewState
所有对页面控件的修改完成后viewstate就被保存了。对像的状态数据还是保留在隐藏的<input>控件里面,呈现给Html的对象状态数据也是从这里取得的。在SaveViewState事件中,其值能被保存到viewstate对象,然而这时在页面上控件的修改却不能了。你可以用SaveViewState来重载这一步,图示如下(图5):

图5

九.呈递给Html
运用Html创建给浏览器输出的页面的时候Render事件就发生了。在Render事件过程中,页面调用其中的对象将它们呈递给Html。然后,页面就可以以Html的形式被用户的浏览器访问了。当Render事件被重载时,开发者可以编写自定义的Html代码使得原先生成的Html都无效而按照新的Html来组织页面。Render方法将一个HtmlTextWriter对象作为参数并用它将Html在浏览器上以网页的形式显示。这时仍然可以做一些修改动作,不过它们只是客户端的一些变化而已了。你可以重载Render事件,图示如下(图6):

图6

十.销毁对象
在呈递给Html完成后,所有的对象都应被销毁。在Dispose事件中,你应该销毁所有在建立这个页面时创建的对象。这时,所有的处理已经完毕,所以销毁任何剩下的对象都是不会产生错误的,包括页面对象。你可以重载Dispose事件,见图6。
全文总结
以上就是Asp.net页面生命周期中的十个事件。每次我们请求一个Asp.net页面时,我们都经历着同样的过程:从初始化对象到销毁对象。通过了解Asp.net页面的内部运行机制,我相信大家在编写、调试代码的时候会更加游刃有余的。

转载于:https://www.cnblogs.com/jacktu/archive/2008/03/03/1088914.html

【转】Asp.net页面的生命周期相关推荐

  1. ASP.NET页面的生命周期

    当一个获取网页的请求(可能是通过用户提交完成的,也可能是通过超链接完成的)被发送到Web服务器后,这个页面就会接着运行从创建到处理完成的一系列事件. ASP.NET页面初始的过程: 1.Page_In ...

  2. asp.net 页面全生命周期

    .Net 托管代码和非托管代码的区别 后台代码隐藏/显示前台控件 .Net 页面生命周期 2012-03-21 13:31:08|  分类: .NET |  标签:.net  页面生命周期  c#  ...

  3. 基础——ASP.NET页面的生命周期

    页请求:页请求发生在页生命周期开始之前.当用户请求一个页面,ASP.NET将确定是否需要分析或者编译该页面,或者是否可以在不运行页的情况下直接请求缓存响应客户端. 开始:发生请求后,页面就进入了初始化 ...

  4. Asp.net页面的生命周期之通俗理解

    很早就看了cat chen的深入理解 ASP.NET 动态控件 (Part 3 - 页面生命周期) ,当时是理解了,但是很不好理解.尤其是追赶加载那部分.最近重新看到那篇文章,禁不住想用打比方的方式来 ...

  5. Asp.net2.0页面的生命周期(续)

    以上就是Asp.net页面生命周期中的几个主要事件.每次我们请求一个Asp.net页面时,我们都经历着同样的过程:从初始化对象到销毁对象.通过了解Asp.net页面的内部运行机制,我相信大家在编写.调 ...

  6. 【Step by Step】编写代码验证一个ASP.NET应用程序和页面的生命周期

    我们知道ASP.NET Page的生命周期实际上是ASP.NET Application的生命周期的一部分.这个周期经历了HTTP Module => HTTP Handler => AS ...

  7. Asp.net2.0页面的生命周期

    当一个获取网页的请求(可能是通过用户提 交完成的,也可能是通过超链接完成的)被发送到Web服务器后,这个页面就会接着运行从创建到处理完成的一系列事件.在我们试图建立Asp.net页面的 时候,这个执行 ...

  8. ASP.NET服务器控件的生命周期分析

    本文实例分析了ASP.NET服务器控件的生命周期.分享给大家供大家参考.具体如下: (1)初始化----在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置:二.跟踪视图状态. ...

  9. .Net页面的生命周期(ZZ)

    1.        初始化:主要是执行Page的Init事件和OnIint方法. 2.        加载视图状态:主要是执行LoadViewState方法,就是从ViewState中获取上一次的状态 ...

最新文章

  1. 修改mysql用户名密码
  2. 硅谷顶级VC发声:AI技术公司毛利实在太低,人工和算力成本太高
  3. Leaflet中自定义marker的icon图标
  4. 一步步实现一个基本的缓存模块
  5. 判断一个点是否在三角形内
  6. 分段线性拟合经典案例:计算多年气温最低值和最高值的分段线性变化趋势(附分段线性拟合工具下载)
  7. 一次MySQL线上慢查询分析及索引使用
  8. 解决小目标检测问题的几个途径
  9. pandas从dataframe中选择部分行、列
  10. 构建微服务(Building Microservices)-PDF 文档
  11. 利用python如何进行数据挖掘
  12. 教你屏蔽CSDN广告
  13. 基于K210的人脸识别门禁
  14. P5713 【深基3.例5】洛谷团队系统
  15. rust被禁播还能玩吗_被强制下架的5部剧,后2部因“尺度太大”被禁播,如今已恢复上架...
  16. Time::HiRes, sleep(), time()
  17. 2021年bilibili程序员节日
  18. oracle11g ora12560,Oracle11gORA-609TNS12537TNS12560
  19. Java实现图片格式转换
  20. 自顶向下和自底向上的估算方式

热门文章

  1. 微信公众号接入图灵机器人实现自动回复消息
  2. taglist go语言支持
  3. 沙利文:奢侈品防伪领域RFID技术作用巨大
  4. [HTML/CSS]margin属性用法
  5. sfdisk命令的使用技巧
  6. 企业应用开发平台-GAP平台
  7. django celery
  8. django用户认证系统——注册3
  9. 图解人工智能机器学习深度学习的关系和区别
  10. 韩顺平php程序员算法