`
justdoithz
  • 浏览: 49603 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

深入研究Asp.net页面的生命周期

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

<?XML:NAMESPACE PREFIX = V /><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><?XML:NAMESPACE PREFIX = O /><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 155.25pt" type="#_x0000_t75"><imagedata src="file:///C:/DOCUME~1/XUXIAN~1/LOCALS~1/Temp/msoclip1/02/clip_image001.png" o:title="Pic1"></imagedata></shape>

图1

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

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 100.5pt" type="#_x0000_t75"><imagedata src="file:///C:/DOCUME~1/XUXIAN~1/LOCALS~1/Temp/msoclip1/02/clip_image001.png" o:title="Pic2"></imagedata></shape>

图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):

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 186pt" type="#_x0000_t75"><imagedata src="file:///C:/DOCUME~1/XUXIAN~1/LOCALS~1/Temp/msoclip1/02/clip_image001.png" o:title="Pic3"></imagedata></shape>

图3

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

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 147.75pt" type="#_x0000_t75"><imagedata src="file:///C:/DOCUME~1/XUXIAN~1/LOCALS~1/Temp/msoclip1/02/clip_image001.png" o:title="Pic4"></imagedata></shape>

图4

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

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 147.75pt" type="#_x0000_t75"><imagedata src="file:///C:/DOCUME~1/XUXIAN~1/LOCALS~1/Temp/msoclip1/02/clip_image001.png" o:title="Pic5"></imagedata></shape>

图5

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

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 147.75pt" type="#_x0000_t75"><imagedata src="file:///C:/DOCUME~1/XUXIAN~1/LOCALS~1/Temp/msoclip1/02/clip_image001.png" o:title="Pic6"></imagedata></shape>

图6

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

相关推荐

    ACCP 6.0 Y2使用ASP.NET技术开发网上书店(11-15章) + 13章素材

    本章将深入研究ASP.NET页面生命周期,包括各个阶段(如初始化、加载、回发和卸载)及其对代码执行的影响。同时,会讲解如何处理用户交互产生的事件,如按钮点击事件,以及如何使用Page_Load和其他生命周期方法来控制...

    ASP.NET深入编程深入学习

    研究ASP.NET Core的微服务架构、Kestrel服务器、中间件系统,以及如何利用.NET Core的优势,如更快的启动时间和更小的部署包。 8. **Web API开发**:学习如何使用ASP.NET Web API创建RESTful服务,理解HTTP协议,...

    asp.net页面提交

    这通常涉及到控件的事件触发和页面生命周期的各个阶段,包括初始化、加载、验证、保存状态和渲染等。 **DoPostBack函数** `DoPostBack`是ASP.NET中的一个JavaScript函数,用于触发服务器端的事件。当用户点击某个...

    道不远人:深入解析ASP.NET 2.0控件开发

    综上所述,“道不远人:深入解析ASP.NET 2.0控件开发”这个主题涵盖了ASP.NET 2.0的核心特性和控件开发技术,深入探讨了页面生命周期、控件继承、视图状态、数据绑定以及安全性等关键知识点。通过学习这些内容,...

    ASP.Net深入开发

    ASP.NET 深入开发是针对微软的Web应用程序开发框架ASP.NET进行的高级研究和实践。这个主题涵盖了许多关键的概念和技术,旨在帮助开发者构建高效、可扩展和安全的Web应用程序。下面将详细介绍ASP.NET的一些核心知识点...

    asp.net网站模板

    在学习这个模板时,初学者可以深入了解ASP.NET的页面生命周期、控件模型、数据绑定以及如何使用C#或VB.NET编写服务器端代码。此外,还可以学习如何使用ASP.NET的身份验证和授权服务,以及如何通过AJAX技术实现页面的...

    8个ASP.NET网站简单例子

    1. **基本结构与页面生命周期**:ASP.NET网站由一系列的.aspx页面组成,每个页面都有自己的生命周期,包括初始化、加载、回发和卸载等阶段。通过实例,你可以学习如何在这些阶段中添加代码以控制页面行为。 2. **...

    ASP.NET 完整项目10个(C#)

    1. **ASP.NET基础**:在这些项目中,你可以看到ASP.NET的基础元素,如ASP.NET页面生命周期、控件、事件处理以及服务器端代码和客户端脚本的交互。通过学习这些项目,你将理解如何使用C#编写后端逻辑,并将它们与HTML...

    ASP.NET完整项目源代码

    基础概念包括页面生命周期、控件事件模型、服务器控件和HTML控件、以及页面间通信(ViewState、Session、Cookie等)。 2. **MVC架构**:其中可能包含基于ASP.NET MVC(Model-View-Controller)的项目,这是一种设计...

    最新ASP.NET+SQL Server项目

    1. **ASP.NET页面生命周期**:了解一个ASP.NET Web Form或MVC页面从请求到响应的完整生命周期,包括初始化、加载、验证、呈现和卸载阶段。 2. **控件事件处理**:掌握ASP.NET控件的事件模型,如何绑定事件处理函数...

    asp.net 仿东京源码

    4. 深入研究ASP.NET中的路由、视图、控制器和模型。 5. 熟悉ASP.NET的身份验证和授权机制。 6. 学习如何使用ASP.NET与数据库交互,如ADO.NET或Entity Framework。 7. 实践项目,例如分析并运行提供的"仿东京源码",...

    基于asp.net的简单购物车系统

    【基于ASP.NET的简单购物车系统】是一个专为初学者设计的教学项目,旨在演示如何使用ASP.NET技术构建一个基础...同时,实践中遇到的问题也会引导学习者去深入研究ASP.NET框架的更多高级特性,从而提升他们的编程技能。

    asp.net完整论坛

    1. **ASP.NET页面生命周期**:每个ASP.NET Web Form都经历一系列的生命周期阶段,包括初始化、加载、验证、呈现和卸载。在论坛应用中,这些阶段用于处理用户交互,如登录、发帖等操作。 2. **控件和事件处理**:ASP...

    ASP.NET小程序(源代码)

    2. ASP.NET页面生命周期:在ASP.NET中,每个.aspx页面都有一个生命周期,包括初始化、加载、验证、呈现和卸载等阶段。开发者可能在这些阶段中编写代码,以控制页面的行为。 3. 控件和事件处理:ASP.NET提供了丰富的...

    ASP.NET校友录课程设计

    通过研究和扩展这个半成品,学习者可以深入理解ASP.NET的开发流程,提高实际编程技能,并掌握构建复杂Web应用程序的方法。 总结来说,"ASP.NET 校友录课程设计"涵盖了ASP.NET Web Forms的基本概念、控件使用、数据...

    ASP.NET 入门 源码

    4. **控件**:深入研究ASP.NET控件,如GridView用于数据展示,Repeater用于自定义布局,以及DropDownList、RadioButton等交互元素。 5. **数据绑定**:了解如何使用DataSource控件与数据库交互,进行数据绑定和操作...

    十天学会ASP.net

    ASP.NET页面生命周期,包括初始化、加载、验证、呈现和卸载等阶段,是理解如何编写动态网页的关键。此外,还会介绍ASP.NET的两种开发模式:Web Forms和MVC(模型-视图-控制器)。 第二天:Web Forms Web Forms是ASP...

    精美的网站,ASP.NET

    1. **页面生命周期**:ASP.NET页面生命周期包括初始化、加载、验证、呈现和卸载等阶段。理解每个阶段的作用是开发高效网页的关键,例如在页面加载事件中处理数据,而在页面呈现阶段则不适合修改控件状态。 2. **...

    深入解析ASP.NET架构.zip

    2. **Web Forms**:ASP.NET Web Forms是另一种开发Web应用的方式,它基于事件驱动模型,提供了丰富的控件和页面生命周期管理,使得开发人员能够像操作Windows桌面应用一样编写Web应用。 3. **页面生命周期**:无论...

    ASP.NET技术在网站开发设计中的研究与开发(论文+源代码+开题报告).zip

    总的来说,这份资源为学习和研究ASP.NET在网站开发中的应用提供了详实的理论知识和实践经验,无论是对初学者还是经验丰富的开发者,都有很高的参考价值。通过阅读论文,开发者可以了解到ASP.NET的关键特性和最佳实践...

Global site tag (gtag.js) - Google Analytics