ASP.NET页面生命周期概述(转载)

本文详细介绍了ASP.NET页面从请求到卸载的整个生命周期过程,包括页请求、开始、初始化、加载、验证、回发事件处理、呈现及卸载等关键阶段。同时,还提供了在各阶段中编写代码以实现特定功能的指导。

ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤。这些步骤包括初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行呈现。了解页的生命周期非常重要,这样就能在合适的生命周期阶段编写代码,以达到预期效果。此外,如果开发自定义控件,则必须熟悉页生命周期,从而正确地初始化控件,使用视图状态数据填充控件属性以及运行所有控件行为逻辑。(控件的生命周期基于页的生命周期,但是页引发的控件事件比单独的 ASP.NET 页中可用的事件多。)

常规页生命周期阶段

一般来说,页要经历下表概述的各个阶段。除了页生命周期阶段以外,还有在请求前后出现的应用程序阶段,但是这些阶段并不特定于页。有关更多信息,请参见 ASP.NET 应用程序生命周期概述

阶段

说明

页请求

页请求发生在页生命周期开始之前。用户请求页时,ASP.NET 将确定是否需要分析和编译页(从而开始页的生命周期),或者是否可以在不运行页的情况下发送页的缓存版本以进行响应。

开始

在开始阶段,将设置页属性,如 Request 和 Response。在此阶段,页还将确定请求是回发请求还是新请求,并设置 IsPostBack 属性。此外,在开始阶段期间,还将设置页的 UICulture 属性。

页初始化

页初始化期间,可以使用页中的控件,并将设置每个控件的 UniqueID 属性。此外,任何主题都将应用于页。如果当前请求是回发请求,则回发数据尚未加载,并且控件属性值尚未还原为视图状态中的值。

加载

加载期间,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。

验证

在验证期间,将调用所有验证程序控件的 Validate 方法,此方法将设置各个验证程序控件和页的 IsValid 属性。

回发事件处理

如果请求是回发请求,则将调用所有事件处理程序。

呈现

在呈现期间,视图状态将被保存到页,然后页将调用每个控件,以将其呈现的输出提供给页的 Response 属性的 OutputStream。

卸载

完全呈现页、将页发送至客户端并准备丢弃时,将调用卸载。此时,将卸载页属性(如 Response 和 Request)并执行清理。

 

生命周期事件

在页生命周期的每个阶段中,页将引发可运行您自己的代码进行处理的事件。对于控件事件,通过以声明方式使用属性(如 onclick)或以使用代码的方式,均可将事件处理程序绑定到事件。

页还支持自动事件连接,即,ASP.NET 将寻找具有特定名称的方法,并在引发特定事件时自动运行这些方法。如果 @ Page 指令的 AutoEventWireup 属性设置为 true(或者如果未定义该属性,因为默认情况下为 true),页事件将自动绑定至使用 Page_event 命名约定的方法,如 Page_Load 和 Page_Init。有关自动事件连接的更多信息,请参见 ASP.NET Web 服务器控件事件模型

下表列出了最常用的页生命周期事件。实际的事件比列出的事件要多。但是,它们不用于大多数页处理方案。而是主要由 ASP.NET 网页上的服务器控件使用,以初始化和呈现它们本身。如果要编写自己的 ASP.NET 服务器控件,则需要详细了解这些阶段。有关创建自定义控件的信息,请参见开发自定义 ASP.NET 服务器控件。

页事件

典型使用

Page_PreInit

·使用 IsPostBack 属性确定是否是第一次处理该页。

·创建或重新创建动态控件。

·动态设置主控页。

·动态设置 Theme 属性。

·读取或设置配置文件属性值。

注意:如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一阶段被改写。

Page_Init

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

Page_Load

·读取和更新控件属性。

Control events

执行特定于应用程序的处理:

·如果页包含验证程序控件,请在执行任何处理之前检查页和各个验证控件的 IsValid 属性。

·处理特定事件,如 Button 控件的 Click 事件。

Page_PreRender

·对页的内容进行最后更改。

Page_Unload

执行最后的清理工作,可能包括:

·关闭打开的文件和数据库连接。

·完成日志记录或其他特定于请求的任务。

注意:在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常。

 

其他的页生命周期注意事项

请注意有关页生命周期的以下附加信息:

·各个 ASP.NET 服务器控件都有自己的生命周期,该生命周期与页生命周期类似。例如,在相应的页事件期间将调用控件的 Init 和 Load 方法。如果页上包含控件,则将首先调用控件的 Init 方法,然后再调用页的 Init 方法。但是,将在调用控件的 Load 方法之前先调用页的 Load 方法。

·通过处理控件的事件,可以自定义控件的外观或内容。例如,所有的控件都将引发 Init、Load 和 Unload 事件,但是页开发人员通常不处理这些事件。而是通常处理特定于控件的事件,如 Button 控件的 Click 事件和 ListBox 控件的 SelectedIndexChanged 事件。在某些情况下,可能也需处理控件的 DataBinding 或 DataBound 事件。有关更多信息,请参见各个控件的类参考主题以及开发自定义 ASP.NET 服务器控件。

    除了处理由页引发的事件以外,还可以重写页的基类中的方法。例如,可以重写页的 InitializeCulture 方法,以便动态设置区域性信息。注意,在使用 Page_event 语法创建事件处理程序时,将隐式调用基实现,因此无需在方法中调用它。例如,无论是否创建 Page_Load 方法,始终都会调用页基类的 OnLoad 方法。但是,如果使用 override 关键字(在 Visual Basic 中为 Overrides)重写页的 OnLoad 方法,则必须显式调用基方法。例如,如果在页中重写 OnLoad 方法,则必须调用 base.Load(在 Visual Basic 中为 MyBase.Load)以运行基实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值