asp.net webform 页面诞生所经历的阶段
一个页面从接收到请求开始到最终送显客户端经历以下阶段(参考自MSDN):
1.Page request
这个阶段发生在页面的生命周期之前。
在接受到用户请求之后,在执行生命周期之前,首先判断在缓存中是否有该页面的缓存版本可以发送至客户端。如果有直接发送,如果没有则开始页面的生命周期。
2.Start
从Page基类继承下来的属性在这个阶段被设置,如Response、Request等属性。
页面的IsPostBack属性在这个阶段里也将被设置,页面将能够确定此次对页面的请求是一个回传请求还是一个新请求。
3.Page initialization
在这个阶段,页面的上的所有控件将被初始化,我们在这个阶段已经可以使用页面的控件。
页面的所有皮肤都会被应用。
但如果这次请求是回发请求,则回发的数据还没有被加载,因此所有控件的状态并没有被ViewState所回复。
4.Load
在这个阶段,如果页面是回发请求,控件状态和值将会从ViewState和控件状态恢复中设置控件属性。
5.Validation
在验证期间,将调用所有验证程序控件的Validate方法,此方法将设置各个验证程序控件和页的IsValid属性。
6.Post back event handling
如果请求是回发请求,则将调用所有事件处理程序。
7.Rending
页面的html的呈现,在这个阶段,会调用页面上所有控件的Render方法,将生成文本内容用于页面的Reaponse属性的输出流,并最终呈现于页面。
8.Unload
完全呈现页并已将页发送至客户端、准备丢弃该页后,将调用卸载。此时,将卸载页属性并执行清理。
在页面生命周期中执行的事件
在页面的一个完整的生命周期中,会执行一系列的事件,下面是一个页面生命周期的事件的例子。
/// 1.确定页面的IsPostBack的属性
/// 2.创建或者动态的创建控件
/// 3.动态设置Theme属性
/// 4.读取或者设置配置文件的属性值
/// </summary>
protected void Page_PreInit(object sender, EventArgs e)
{
Response.Write("Page_PreInit<br/>");
}
/// <summary>
/// 所有控件都完成了初始化和外观设置
/// 可以在这个事件中读取或者设置控件属性
/// </summary>
protected void Page_Init(object sender, EventArgs e)
{
Response.Write("Page_Init<br/>");
}
/// <summary>
///调用这个事件时,需要完成页面上所有的初始化
/// </summary>
protected void Page_InitComplete(object sender, EventArgs e)
{
Response.Write("Page_InitComplete<br/>");
}
/// <summary>
/// 页面和页面的上的控件还没有被加载(执行OnLoad事件)
/// 执行这个事件时,会为页面和页面的控件加载ViewState
/// 处理Request实例中包含的任何回发数据
/// </summary>
protected void Page_PreLoad(object sender, EventArgs e)
{
Response.Write("Page_PreLoad<br/>");
}
/// <summary>
/// 通过递归的方式对页面以及其包含的说有控件执行OnLoad事件
/// </summary>
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Page_Load<br/>");
}
/// <summary>
/// 在PsotBack当中,所有事件处理都是在Page_Load之后,Page_LoadComplete之前
/// </summary>
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = "ControlEvent";
Response.Write("Button事件触发!<br/>");
}
/// <summary>
/// 在所有控件都加载完成后再执行该事件
/// </summary>
protected void Page_LoadComplete(object sender, EventArgs e)
{
Response.Write("Page_LoadComplete<br/>");
}
/// <summary>
/// 在该事件进行对页和控件的内容进行最后的更改
/// </summary>
protected void Page_PreRender(object sender, EventArgs e)
{
Response.Write("Page_PreRender<br/>");
}
/// <summary>
/// 该事件发生前,页和控件已经保存了所有的ViewState
/// </summary>
protected void Page_SaveStateComplete(object sender, EventArgs e)
{
Response.Write("Page_SaveStateComplete<br/>");
}
//render
//不是一个事件,这是会执行页面的所有的render方法,将页面控件以呈现以HTML
//.ascx文件会被自动合并呈现,因此不需要在代码中在显式的呈现
/// <summary>
/// 该事件先针对每个控件执行,然后针对页面执行
/// 完成了卸载页面属性(如Response等)
/// </summary>
protected void Page_Unload(object sender, EventArgs e)
{
int i = 0;
i++; //该事件中,由于Response属性已经被卸载清除,因此不能够再使用Response.Write
}
参考资料:Pro ASP.NET 3.5 in C# 2008