ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

ASP.NET 页面运行时会通过生命周期来完成一系列的处理步骤。包括初始化,控件实例化,状态恢复和维护,运行事件处理代码,以及外观的呈现。了解页面生命周期是重要的,可以根据需要针对特定情景编写处理代码。另外,开发自定义控件也必须熟悉页面生命周期中正确的控件初始化指令,使用视图状态数据的控件属性,以及运行控件行为逻辑(控件的生命周期依赖于页面生命周期,因此页面会为控件引发比自己更多的事件)。

页面生命周期的一般情况

一般情况下,页面通过下表列出的情景大纲。除了页面生命周期情景之外,在请求开始和结束的时候还会发生除页面之外的应用程序情景。

情景描述

请求页面

页面请求发生在页面生命周期开始之前。当用户发送页面请求,ASP.NET 检测是否需要对页面进行处理或编译(页面生命周期由此开始),也可以直接用已缓存的页面作为回应。

开始

在该步骤中会设置页面的 RequestResponse 属性。页面会根据请求是否回传或新建来设置 IsPostBack 属性。另外,在开始时,页面还会设置 UICulture 属性。

页面初始化

页面初始化时,页面控件会生效并为每个控件设置 UniqueID 属性。主题定义也被作用于页面。如果当前请求已回传,回传的数据并不会被读取,且视图状态也不保存任何控件的属性值。

读入

读入时,如果当前请求已回传,控件属性会从视图状态和控件状态中读入。

验证

验证时会调用所有验证器的 Validate 方法,并分别为页面中的验证器设置 IsValid 属性。

处理回传事件

如果请求已回传,将调用所有事件处理器。

呈现

页面呈现时会保存视图状态,并将所有控件输出通过 ResponseOutputStream 对象进行呈现。

卸载

当页面完全呈现后调用,且发送到客户端。同时,页面的 ResponseRequest 属性也被卸载并清除。

生命周期事件

在每个页面生命周期情景下,可以对页面引发的事件编写自定义代码进行处理。至于控件事件,则通过绑定属性(如 OnClick)或编写代码的方式进行事件处理器绑定。

页面也支持自动事件的触发,ASP.NET 会监视并在特定事件引发后自动运行这些有特定名称的事件。如果 @ 页面指令的 AutoEventWireup 参数设置成 true(默认值为 true),页面事件就会自动绑定到以“Page_事件”格式命名的方法(如 Page_LoadPage_Init)。

下表列出部分页面生命周期中的常用事件。还有一些未被列出的原因是不常用,且主要用于 ASP.NET Web 页面对控件的初始化和呈现。除非编写自定义 ASP.NET 服务器控件,就需要了解这些情景。

页面事件典型用途

Page_PreInit

  • 使用 IsPostBack 属性检测页面被回传还是第一次被请求。

  • 创建或重建动态控件。

  • 动态设置模板页。

  • 动态设置 Theme 属性。

  • 读取或设置档案属性。

注意:如果请求被回传,控件的值就不能从视图状态中恢复。在这个时候设置的控件属性,将会覆盖下一个情景中的值。

Page_Init

  • 读取或初始化控件属性。

Page_Load

  • 读取并更新控件属性。

控件事件

完成应用程序处理:

  • 如果页面中包含验证器控件,则在进行任何操作之前先检查所有验证控件的 IsValid 属性。

  • 处理指定事件(如 Button 控件的 Click 事件)。

Page_PreRender

  • 完成页面控件的最后更改。

Page_Unload

完成最后的清除工作,其中包括:

  • 关闭文件和数据库连接。

  • 完成登入或其他请求任务。

注意:在卸载时,页面和控件都会重新呈现,可进一步对回应过程进行修改。如果尝试对 Response.Write 之类的方法进行,页面就会产生并抛出一个异常。

附加的页面生命周期考虑因素

请注意下列关于页面生命周期的附加信息:

  • 与页面一样,每个 ASP.NET 服务器控件都拥有属于自已的生命周期。比如,控件的 InitLoad 方法会在相应的页面事件中得到调用。而页面控件的 Init 方法只能在页面 Init 方法之后调用。但是,页面的 Load 方法能够在控件 Load 方法之前被调用。

  • 通过控件事件可以自定义控件的外观和内容。比如,所有控件都引发 InitLoadUnload 等事件,尽管开发者并不经常处理这些事件。但在处理控件事件时却经常需要用到(如 Button 控件的 Click 事件和 ListBox 控件的 SelectedIndexChanged 事件)。在某些情况下还有可能处理控件的 DataBindingDataBound 事件。

  • 另外,在处理页面生命周期事件时,可以重载 Page 派生类的方法。比如,重载页面的 InitializeCulture 方法动态设置文化信息。创建以“Page_事件”格式命名的事件重载处理时,会先隐式调用基类的实现,因此不需要编写代码进行显式调用。比如,不管是否已经重载页面的 Page_Load 方法。ASP.NET 始终会自动调用页面基类的 OnLoad 方法。但是,使用 override 关键字重载页面的 OnLoad 方法时就需要显式调用基类的实现。比如,重载页面的 OnLoad 方法时必须编写 base.Load (Visual Basic 的写法是 MyBase.Load)来明确地运行基类的实现。

posted on 2006-12-07 15:21  Laeb  阅读(829)  评论(0编辑  收藏  举报