ASP.NET 页面生命周期事件






4.94/5 (41投票s)
当页面请求发送到 Web 服务器时,页面在其创建和处置过程中会经历一系列事件。在本文中,我将
当页面请求发送到 Web 服务器时,页面在其创建和处置过程中会经历一系列事件。在本文中,我将详细讨论 ASP.NET 页面生命周期事件。
(1) PreInit 页面生命周期的入口点是称为“PreInit”的预初始化阶段。这是唯一允许以编程方式访问母版页和主题的事件。您可以在此事件中动态设置母版页和主题的值。您还可以在此事件中动态创建控件。
示例: 在您的 aspx 页面的代码隐藏 cs 文件中重写事件,如下所示
using System;
using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page{ protected void Page_PreInit(object sender, EventArgs e) { // 用于以下用途: // 检查 IsPostBack 属性以确定页面是否是首次处理。 // 创建或重新创建动态控件。 // 动态设置母版页。 // 动态设置主题。 }
------------------------------------------------------------------------
(2)Init 此事件在每个控件初始化后、每个控件的 UniqueID 被设置以及应用任何皮肤设置后触发。您可以使用此事件更改控件的初始化值。对于层次结构中最底层的控件,首先触发“Init”事件,然后向上触发,直到为页面本身触发。
示例: 在您的 aspx 页面的代码隐藏 cs 文件中重写事件,如下所示
protected void Page_Init(object sender, EventArgs e)
{// 在所有控件初始化并应用皮肤设置后触发。使用此事件读取或初始化控件属性。}
-------------------------------------------------------------------
(3)InitComplete 页面及其控件的所有初始化完成后触发。此时视图状态值尚未加载,因此您可以使用此事件对视图状态进行更改,以确保这些更改在下一次回发后得以保留。
示例: 在您的 aspx 页面的代码隐藏 cs 文件中重写事件,如下所示
protected void Page_InitComplete(object sender, EventArgs e)
{ // 由 Page 对象引发。使用此事件处理需要所有初始化完成的任务。}
------------------------------------------------------------------------
(4)PreLoad 在页面加载其自身和所有控件的视图状态,以及处理 Request 实例附带的回发数据后触发。
(1)加载视图状态:视图状态数据已加载到控件中
注意:页面视图状态由 ASP.NET 管理,用于在页面往返服务器时保持信息。视图状态信息保存为一对一对的字符串,包含诸如控件文本或值的信息。视图状态保存在一个隐藏的 <input> 控件的 value 属性中,该控件在页面请求之间传递。
(2)加载回发数据:回发数据现在已传递到页面控件
注意:在页面创建的此阶段,已发布到服务器的表单数据(在 ASP.NET 中称为回发数据)会针对需要它的每个控件进行处理。因此,页面会触发 LoadPostData 事件,并遍历页面查找每个控件,然后使用正确的回发数据更新控件状态。ASP.NET 通过将控件的唯一 ID 与 NameValueCollection 中的键/值对进行匹配来更新正确的控件。这是 ASP.NET 要求任何给定页面上的每个控件都具有唯一 ID 的原因之一。
示例: 在您的 aspx 页面的代码隐藏 cs 文件中重写事件,如下所示
protected override void OnPreLoad(EventArgs e)
{ // 如果您需要在 Load 事件之前对页面或控件执行处理,请使用此事件。 // 在 Page 实例引发此事件之前,它会加载其自身和所有控件的视图状态,然后处理 Request 实例附带的任何回发数据。}
------------------------------------------------------------------------
(5)Load 关于此事件要记住的重要一点是,此时页面已恢复到回发情况下的先前状态。页面加载事件中的代码通常会检查 PostBack,然后相应地设置控件属性。此方法通常用于大多数代码,因为这是页面生命周期中所有值都已恢复的第一个地方。大多数代码会检查 IsPostBack 的值以避免不必要地重置状态。您也可以在此方法中调用 Validate 并检查 IsValid 的值。您还可以在此方法中创建动态控件。
示例: 在您的 aspx 页面的代码隐藏 cs 文件中重写事件,如下所示
protected void Page_Load(object sender, EventArgs e)
{ // Page 调用 Page 的 OnLoad 事件方法,然后递归地对每个子控件执行相同的操作,子控件再对其各自的子控件执行相同的操作,直到页面和所有控件都加载完毕。 // 使用 OnLoad 事件方法设置控件中的属性并建立数据库连接。}
------------------------------------------------------------------------
(6)控件 (回发) 事件ASP.NET 现在调用页面或其控件上导致回发发生的任何事件。例如,这可能是按钮的单击事件或下拉列表的 SelectedIndexChanged 事件。这些是您在代码隐藏类 (.cs 文件) 中编写了代码的事件。
示例: 在您的 aspx 页面的代码隐藏 cs 文件中重写事件,如下所示
protected void Button1_Click(object sender, EventArgs e)
{ // 这只是控件事件的一个示例。这里是导致回发的按钮单击事件。}
---------------------------------------------------------------------
(7)LoadComplete 此事件标志着 Load 阶段的结束。
示例: 在您的 aspx 页面的代码隐藏 cs 文件中重写事件,如下所示
protected void Page_LoadComplete(object sender, EventArgs e)
{ // 使用此事件处理需要页面上所有其他控件都已加载的任务。}
----------------------------------------------------------------------
(8)PreRender 允许对页面或其控件进行最终更改。此事件发生在所有常规回发事件之后。此事件发生在保存视图状态之前,因此在此处所做的任何更改都会被保存。例如:在此事件之后,您无法更改按钮的任何属性或更改任何视图状态值。因为在此事件之后,会调用 SaveStateComplete 和 Render 事件。
示例: 在您的 aspx 页面的代码隐藏 cs 文件中重写事件,如下所示
protected override void OnPreRender(EventArgs e)
{ // 每个 DataSourceID 属性设置为数据绑定控件都会调用其 DataBind 方法。 // PreRender 事件会为页面上的每个控件发生。使用此事件对页面内容或控件进行最终更改。}
-----------------------------------------------------------------------
(9)SaveStateComplete 在此事件之前,页面及其控件的视图状态已设置。此时或之后对页面控件所做的任何更改都将被忽略。
示例: 在您的 aspx 页面的代码隐藏 cs 文件中重写事件,如下所示
protected override void OnSaveStateComplete(EventArgs e)
{ // 在此事件发生之前,已为页面和所有控件保存了 ViewState。此时对页面或控件的任何更改都将被忽略。 // 使用此事件执行需要保存视图状态但不对控件进行任何更改的任务。}
------------------------------------------------------------------------
(10)Render 这是页面对象及其控件的一个方法(而不是事件)。此时,ASP.NET 会调用此方法来获取每个页面的控件的输出。Render 方法会生成客户端 HTML、动态 HTML (DHTML) 和脚本,这些都是在浏览器中正确显示控件所必需的。
注意: 在客户端浏览器中显示的网页上右键单击并查看“页面源代码”。您不会在代码中找到任何 aspx 服务器控件。因为所有 aspx 控件都已转换为它们各自的 HTML 表示形式。浏览器能够显示 HTML 和客户端脚本。
示例: 在您的 aspx 页面的代码隐藏 cs 文件中重写事件,如下所示
// 渲染阶段在此处进行。这不是一个事件
------------------------------------------------------------------------
(11)UnLoad 此事件用于清理代码。在页面 HTML 渲染完成后,对象将被处置。在此事件期间,您应该销毁在构建页面时创建的任何对象或引用。此时,所有处理都已完成,可以安全地处置任何剩余的对象,包括 Page 对象。清理可以在
(a)类实例,即对象
(b)关闭打开的文件
(c)关闭数据库连接。
示例: 在您的 aspx 页面的代码隐藏 cs 文件中重写事件,如下所示
protected void Page_UnLoad(object sender, EventArgs e)
{ // 此事件对每个控件然后对页面发生。在控件中,使用此事件为特定控件执行最终清理,例如关闭特定于控件的数据库连接。 // 在卸载阶段,页面及其控件已渲染,因此您无法对响应流进行进一步更改。 //如果您尝试调用 Response.Write 方法,页面将抛出异常。 }
------------------------------------------------------------------
更多参考 : 请遵循以下链接 (1) http://www.15seconds.com/issue/020102.htm(2) http://msdn.microsoft.com/en-us/library/ms178472.aspx(3) http://www.devlifestyle.net/blogs/articles/archive/2009/05/24/asp-net-internals-viewstate-and-page-life-cycle.aspx 谢谢...