您的位置:首页 > 编程语言 > ASP

asp.net常规页生命周期阶段列表和事件列表

2009-03-29 18:51 288 查看
当我们使用asp.net开发网站,每运行一个页面,这个页面都将经历一个生命周期。了解页的生命周期非常重要,因为这样我们才能在合适的生命周期编写代码实现预期效果。网上有一句话概括非常精辟:"Do the right thing at the right time in the right place."。微软的文档给出的ASP.NET生命周期如下:

1 Page Request --页面请求

2 Start --开始

3 Page Initialization --页初始化

4 Load --加载

5 Validation --验证

6 Postback event handling --回发事件处理

7 Rendering --呈现

8 Unload --卸载
一、生命周期阶段列表

下面来看看每个阶段对应的具体说明:

1、页请求

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

2、开始

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

3、页初始化

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

4、加载

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

5、验证

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

6、回发事件处理

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

7、呈现

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

8、卸载

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

二、生命周期事件列表(常见)

1、Page_PreInit

典型应用:

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

创建或者重新创建动态控件;

动态设置母版页;

动态设置Theme属性;

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

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

2、Page_Init

典型应用:

读取或初始化控件属性

3、Page_Load

典型应用:

读取或更新控件属性

4、Controlevents

典型应用:

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

如果页包含验证程序控件,则在执行任何处理之前坚持页和各个验证控件的IsValid属性;

处理特定事件,如Button的Click事件

5、Page_PreRender

典型应用:

对页的内容进行最后更改

6、Page_Unload

典型应用:

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

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

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

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

好了,最后来一个经典的代码实例来回顾一下前面讲的主要内容。Code is cheap。看代码了:

using System;

using System.Configuration;

using System.Data;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

/// <summary>

/// 新建一个aspx页面,名称Default.aspx

/// </summary>

public partial class Default : System.Web.UI.Page

{

protected void Page_PreInit(object sender, EventArgs e)

{

Response.Write("Page_PreInit<br/>");

}

protected void Page_Init(object sender, EventArgs e)

{

Response.Write("Page_Init<br/>");

}

protected void Page_InitComplete(object sender, EventArgs e)

{

Response.Write("Page_InitComplete<br/>");

}

protected void Page_PreLoad(object sender, EventArgs e)

{

Response.Write("Page_PreLoad<br/>");

}

protected void Page_Load(object sender, EventArgs e)

{

Response.Write("Page_Load<br/>");

}

protected void Page_LoadComplete(object sender, EventArgs e)

{

Response.Write("Page_LoadComplete<br/>");

}

protected void Page_PreRender(object sender, EventArgs e)

{

Response.Write("Page_PreRender<br/>");

}

protected void Page_SaveStateComplete(object sender, EventArgs e)

{

Response.Write("Page_SaveStateComplete<br/>");

}

/// <summary>

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

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void Page_Unload(object sender, EventArgs e)

{

int i = 0;

i++;//这行代码是用来设置断点的,为什么不用Response.Write? *****

}

protected void Button1_Click(object sender, EventArgs e)

{

Label1.Text = "ControlEvent";

Response.Write("Button事件触发!<br/>");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: