上图为ASP.NET页面生命周期图。
以下详细讲解一下ASP.NET的页面生命周期。
请求页
请求页发生在页生命周期之前。用户请求时,ASP.NET将确定是否需要分析和编译页面,或者是否可以在不运行页的情况下输出缓存来进行响应。
开始
初始化页面类的属性。设置Request和Response,用于处理用户的请求和要回发数据库的响应的对象,确定是回发请求还是新请求来设置IsPostBack属性。此外,还将设置页的UICulture属性。
页面初始化
可以使用控件,并将设置每个控件的UniqueID属性。此外,任何主题都将应用于页。如果当前请求是回发请求,则回发数据尚未加载,并且控件属性值尚未还原为视图状态中的值。
而且所有控件的属性都将被用默认值来做初始化。
控件加载
读取或者初始化控件的属性,如果当前请求为回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。故控件的初始化数据必须在调用来维护控件的视图状态后加载才能保留下来。
验证
通过调用所有验证程序控件的 Validate 方法,此方法将设置各个验证程序控件和页的 IsValid属性。
加载视图状态(页面是回发时才有)
在这个事件中运行时从隐藏域(ViewState)中分解出视图状态并加载到所有启用了视图状态的控件中。
加载回发数据(页面是回发时才有)
实现了IPostBackDataHandler接口的控件HTTP的Post数据中得到值。但TextBox控件不能从视图状态中获得值,而是在此事件中从POST数据中获得值。
页面加载
读取和更新控件属性,与控件加载过程不同的是,该事件发生在Page_Load方法中,可以实现该方法中一些初始化的操作、判断页面是否第一次加载等等,DropDownList和CheckBoxList的Items条目程序添加也是发生在这个事件中。
但Page_Load不是Page类第一个触发的方法。
回发事件处理
如果请求是回发请求,则将调用所有事件处理程序。注意,事件触发之前首先要触发Page_Load。
呈现
在呈现之前,ASP.NET会针对该页和所有控件保存视图状态。在呈现阶段中,页会针对每个控件调用 Render 方法,它会提供一个文本编写器,用于将控件的输出写入页的 Response 属性的 OutputStream 中。
完全呈现页并已将页发送至客户端、准备丢弃该页后,将调用卸载。此时,将卸载页属性(如 Response 和 Request)并执行清理。包括关闭打开的文件和数据库连接,完成日志记录或者其他任务。