转:asp.net——知识整理(1)asp.net常规页生命周期阶段列表和事件列表

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



当我们使用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将确定是否需要分析和编译页,或者是否可以在不运行页的情况下,发送缓存版本以进行响应。后者是通过处理@OutputCache指令来控制页面缓存策略的。
2、开始
在开始阶段,将设置页属性,如Request和Response。在此阶段,页还将确定请求是回发请求还是新请求,并设置ispostback属性。此外,在开始阶段期间,将设置页的UICulture属性。
3、页初始化(对应Page_PreInit事件)
该阶段,可以使用页中的控件,并将设置每个控件的UniqueID属性。此外,任何主题都将应用于页。如果当前请求是回发请求,则回发数据尚未加载,并且控件属性值尚未还原为视图状态中的值。
在这个页面级的事件中,所有在设计时创建的控件都将被用默认值做初始化。例如,如果你有一个Text属性值为“Hello”的TextBox控件,则此时这个属性被设置。这个事件仅仅发生在页级别的类中,用户控件和母版页没有这个事件,而动态设置页面主题只能在这个事件中进行。
4、(控件)加载(对应Page_Init事件)
该阶段,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。
5、验证
在验证期间,将调用所有验证控件的Validate方法,此方法将设置各个验证程序控件和页的IsValid属性。
6、页面加载(对应Page_Load事件)
   一般的页面加载都放在这个事件中去处理。千万不要以为这就是Page类第一个触发的方法。
   如果页面时回发(PostBack)的话,在Page_Load之前还会有两个过程:
1)加载视图状态:在这个事件中运行时从隐藏域中分解出视图状态并加载到所有启用了视图状态的控件中。
2)加载回发数据:在这个事件里实现了IPostBackDataHandler接口的控件从HTTP的Post数据中得到值。注意,Textbox控件不能从视图状态中获得值,而是在此事件中从POST数据中获得值。
7、回发事件处理
如果请求是回发事件,则将调用所有事件处理程序。
8、呈现
在这个步骤中,ASP.NET将会处理当前视图状态,并将其序列化保存到页。接着调用每个控件,将其呈现通过Response属性的OutPutStream输出。
9、卸载(对应Page_Unload事件)
完全呈现页将页发送至客户端并准备丢弃时,将调用卸载。此时,将卸载页实例并执行清理,包括如关闭打开的文件和数据库连接,完成日志记录或其他任务。
二、生命周期事件列表(常见)
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/>");
    }
}

posted @ 2011-10-09 17:24  EverSteins  阅读(167)  评论(0编辑  收藏  举报