ASP.NET页面生命周期描述(转自http://hi.baidu.com/meiixaohu8/blog/item/c1d7171052722cf4c3ce79a2.html)

在以前写个一篇关于ASP.NET页面生命周期的草稿,最近又看了看ASP.NET,做个补充,看看页面初始过程到底是怎么样的
下面是ASP.NET页面初始的过程:
1. Page_Init();
2. Load ViewState;
3. Load Postback data;
4. Page_Load();
5. Handle control events;
6. Page_PreRender();
7. Page_Render();
8. Unload event;
9. Dispose method called;

下面对其中的一些过程作下描述:
1. Page_Init();
这个过程主要是初始化控件,每次页面载入执行这个初始过程,包括第一次和以后的Postback(这里说下Postback,其实就可以简单理解成用户点击SUBMIT按钮之类的,把表单<Form>提交给服务器,这就是一次postback),在这里面可以访问控件,但是这里面的控件值不是我们期待的控件里面的值,他只是一个控件的初始值(默认值),举例: 比如一个TextBox1,我们填入了"哈哈",在点击SUBMIT提交了页面后,在Page_Init()里面,我们访问到的TextBox1.Text不是我们的"哈哈",而是开始的""空字符串,如果TextBox1在我们设计的时候提供了默认值,这里访问到的也就是提供的默认值,为什么呢,这就要看下一个过程了.

对应的事件Page.Init

2. Load ViewState
这个过程是载入VIEWSTATE和Postback数据,比如我们上面的TextBox1,这时就赋了"哈哈",所以,在Post_Init()对控件赋值是无意义的,它都会在这个过程里被改写,当然第一次页面载入例外,因为没有VIEWSTATE数据。

没有对应的事件

3.Load Postback data;
上面说了,Postback可以理解成用户提交表单数据,所以这里就是处理表单数据,当然这里要设计到控件的设计,一般情况不会要我们自己处理这个过程,我们暂且略过. (在以前那篇关于ASP.NET页面生命周期的简单描述中,把这个过程和Load ViewState放在了一起,其实那是微软提供的生命周期过程,这里单独提出来是为了让大家明白这是一个单独的过程)

没有对应的事件
4. Page_Load();
这个过程也是每次页面载入时一定会执行的,但是注意和Page_Init的区别,上面已经涉及了,这里注意的是一般都会用到Page.IsPostBack,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问。
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
   //第一次执行的CODE HERE
}
else
{
    //用户提交FORM(即Postback)CODE HERE
}

//每次这里的都回执行CODE HERE
}

对应的事件Page.Load

5. Handle control events;
这个过程里,相应具体的控件事件,比如private void ListBox1_SelectedIndexChanged(object sender, System.EventArgs e)事件等等

没有对应的事件(我们自己的事件函数都包括在这个过程里比如上面的ListBox1_SelectedIndexChanged)

6. Page_
预先呈递对象,这里是在向用户程序呈现数据的倒数第二步,我估计提供这个过程的意义,也就是在这里能对控件属性等等要呈现给用户的数据进行修改,这也是最后的修改,以前的修改(比如在Page_Init里面)都可能被覆盖.做完这了还会进行一个操作就是保存状态,即SaveViewState.

对应的事件时Page.PreRender

7. Page_Render();
大家可以在浏缆器里View->Source查看到,每个页面都有一个隐藏的<input>,这里面的"__VIEWSTATE"就是我们服务器写回来的页面状态信息,在这个之前,服务器要呈现页面(也就是构造HTML格式的文件),就是从这个"__VIEWSTATE"里面获取的数据,当然大家也注意到了,这里有个Page.Render事件,我们可以添加自己的处理代码,也就是说我们又可以更改数据,不过这里推荐不要在这里修改,既然提供了PreRender,就应该在里面做最后的修改,当然这不是必须的,只是推荐!

对应的事件Page.Render

8. Unload event;
大家应该明白,当想服务器请求一个对象的时候,就会在内存里生成一个继承页面对象,也就是页面的类,它继承自System.Web.UI.Page.
当页面对象从内存中卸载时发生,将触发该事件.

对应的事件Page.Unload

9. Dispose method called;
销毁所有的对象.当从内存释放Page时发生,这是生存期的最后阶段。可能第8和9似乎有些模糊,不过我也没怎么搞清楚,待研究!

对应的事件Dispose

以上就是ASP.NET页面周期的描述。

注意上面灰色背景的文字,如果一个过程中有对应的事件,我们可以自己定义一个函数(当然先在MSDN中找到函数原型),然后在
InitializeComponent中向事件的链表上添加上去,像下面:
private void InitializeComponent()
{   
this.Unload += new System.EventHandler(this.MainWebForm_Unload);
this.Load += new System.EventHandler(this.Page_Load);
this.Init += new System.EventHandler(this.Page_Init);
this.PreRender += new System.EventHandler(this.My_PreRender);
}

对于几个没有对应事件的过程,比如2.Load ViewState,我们可以重载Page的虚函数protected override void LoadViewState(object savedState);来添加自己的控制代码,不过切忌掉用基类的对应方法,比如:
protected override void LoadViewState(object savedState)
{
//自己处理VIEWSTATE
base.LoadViewState (savedState);
}

********************************************************************

一. 初始化 - Init 事件 (OnInit 方法) 初始化对象
    当有来自客户端的请求时,asp.net绘制一个全新的页面,初始化页面对象,例如可以在加载控件之前检测客户端环境变量。注意,每次加载时都会触发这个事件(也有说:网页重新加载时不会触发这个事件)。

二. 加载视图状态 - (没有对应事件)LoadViewState方法 导入Viewstate数据

三. 处理回发数据 - LoadPostData 方法
    对实现 IPostBackDataHandler 接口的控件,即可以自动加载回发数据的控件,如 TextBox, DropDownList(Button不是) 等。 当一个页面提交一个表单时,框架就在每个提交了数据的控件上执行一个IPostBackDataHandler接口操作。然后页面执行 LoadPostData事件,解析页面,找到每个执行了IpostBackDataHandler接口操作的控件,并用恰当的postback数据更新 这些控件状态。在LoadPostData事件后,就要执行下面的RaisePostDataChanged事件了。
注:IPostBackDatahandler 接口有LoadPostData方法(当由某个类实现时,它为 ASP.NET 服务器控件处理回发数据Msdn)和RaisePostDataChangedEvent方法(当由类实现时,它用信号要求服务器控件对象通知 ASP.NET 应用程序该控件的状态已更改。Msdn)

四. 加载 - Load 事件 (OnLoad 方法)
    当页面被读入(加载入)内存,进行处理时触发该事件,每次刷新时,.net都会为他绘制一个全新的页面,所以,每次重新加载都会触发这个事件。在Load 事件中,对象都实例化了,所有的对象第一次被布置在DOM页面(在Asp.net中称控件树)里了并且可以通过代码或是相关的位置被引用。这样,对象就可 以很容易的从客户端获得诸如宽度、高度、值、可见性等在Html中的属性值。在Load事件中,当然还有像设置控件属性等操作的发生。这个过程是整个生命 周期中最重要、最主要的,你可以通过调用OnLoad来重载Load事件

五. 发送回发更改通知 - RaisePostDataChangedEvent 方法
    对实现 IPostBackDataHandler 接口的控件,即可以自动加载回发数据的控件。
    在第 3 步中加载回发数据,如果回发前后数据发生更改,则在这一步触发相应的服务端事件。就像在上面提到的那样,这个事件是发生在所有的控件执行了 IPostBackDataHandler接口操作并被正确的postback数据更新后的。在这个过程中,每个控件都被赋予一个布尔值来标志该控件有没 有被更新。然后,Asp.net就在整个页面上寻找任何已被更新过的控件并执行RaisePostDataChanged事件操作。不过,这个事件是要在 所有的控件都被更新了以及Load事件完成后才进行的。这样就保证了一个控件在被postback数据更新前,别的控件在 RaisePostDataChanged事件中是不会被手动改变的。

六. 处理回发事件 - RaisePostBackEvent 方法
   对实现 IPostBackEventHandler 接口的控件,即能引起回发的控件,如 Button, LinkButton, Calendar 等

七. 预呈现 - PreRender 事件 (OnPreRender 方法)
  
八. 保存视图状态 - SaveViewState 方法

九. 呈现 - Render 方法

十. 处置 - Dispose 方法

十一. 卸载 - UnLoad 事件 (OnUnLoad 方法)


************************************************************************************************************************
提炼自:【ASP.NET开发答疑200问】一书..
①页面初始化
---------- 收到客户端的请求,产生相应页面的Page对象,通过Page_Init事件进行page对象及其控件的初始化.
②加载视图状态
------- ViewState 是存放页面服务器控件的属性和值的集合,客户端通过一个隐藏控件_ViewState把其传到服务器(服务器端也有这么一个变量,该步即为使用服务器端的 ViewState,相对于客户端传过来的_ViewState,它是旧版本)________此处不一定对,纯属个人理解.
= .继续

③回传数据处理
------- 从第一步里的客户请求里找到_ViewState,并提取其中的数据,为页面的控件赋值.
④页面加载
------------ 执行Load()事件,感觉是Page_Load(),对象都被实例化,(控件都被赋值了,这里的实例化是指 * .cs里的类,好像)
⑤RaisePostBackChanged事件
--------- 控件被赋予一个bool值,标识是否被更新了.
⑥回传事件处理
------- 就是客户端触发的那些事件,开始执行.比如按了个Button什么的.所需要执行的具体过程.
⑦页面预返回阶段
---- 对控件的属性值,控件树结构做修改的最后机会.
⑧保存ViewState
------- 把服务器控件的属性和值保存在ViewState中(服务器端),供下一次页面请求时使用.所以说相对于下一次该页面的请求,该ViewState是旧版本.
⑨页面返回阶段
------- 把刚刚生成的页面发送到客户端.
⑩销毁对象
------------ 调用Dispose事件,把该网页销毁,把其占用的所有资源释放.


客户端的一次请求在服务器端的处理过程终于完成了.
!!!!!
一.初始化对象
二.导入viewstate数据
三.用loadpostdata处理postback数据
四.导入对象
五.raisepostbackchanged事件
六.处理客户端postback事件
七.预先呈递对象
八.保存viewstate
九.呈递给html
十.销毁对象
以上就是asp.net页面生命周期中的十个事件。每次我们请求一个asp.net页面时,我们都经历着同样的过程从初始化对象到销毁对象

你可能感兴趣的:(asp.net)