现在的位置: 首页 > 综合 > 正文

清清楚楚asp.net ( 四 ) :页面生命周期

2013年05月19日 ⁄ 综合 ⁄ 共 3010字 ⁄ 字号 评论关闭

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

完全呈现页并已将页发送至客户端、准备丢弃该页后,将调用卸载。此时,将卸载页属性并执行清理。

 

在页面生命周期中执行的事件

在页面的一个完整的生命周期中,会执行一系列的事件,下面是一个页面生命周期的事件的例子。

C#

    /// <summary>
    
/// 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
    }

 

 

清清楚楚asp.net系列学习博客目录 

 

参考资料:Pro ASP.NET 3.5 in C# 2008  

 

 

抱歉!评论已关闭.