ASP.NET Web Page应用深入探讨 四
2008-05-12 09:25:23.0
加载 执行所有请求共有的操作,如设置数据库查询。此时,树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。请参阅处理继承的事件。 Load 事件(OnLoad 方法)

  发送回发更改通知 引发更改事件以响应当前和以前回发之间的状态更改。请参阅处理回发数据。

  注意 只有引发回发更改事件的控件参与此阶段。 RaisePostDataChangedEvent 方法(如果已实现 IPostBackDataHandler)

  处理回发事件 处理引起回发的客户端事件,并在服务器上引发相应的事件。请参阅捕获回发事件。

  注意 只有处理回发事件的控件参与此阶段。 RaisePostBackEvent 方法(如果已实现 IPostBackEventHandler)

  预呈现 在呈现输出之前执行任何更新。可以保存在预呈现阶段对控件状态所做的更改,而在呈现阶段所对的更改则会丢失。请参阅处理继承的事件。 PreRender 事件(OnPreRender 方法)

  保存状态 在此阶段后,自动将控件的 ViewState 属性保持到字符串对象中。此字符串对象被发送到客户端并作为隐藏变量发送回来。为了提高效率,控件可以重写 SaveViewState 方法以修改 ViewState 属性。请参阅维护控件中的状态。 SaveViewState 方法呈现 生成呈现给客户端的输出。请参阅呈现 ASP.NET 服务器控件。 Render 方法处置 执行销毁控件前的所有最终清理操作。在此阶段必须释放对昂贵资源的引用,如数据库链接。请参阅 ASP.NET 服务器控件中的方法。

  Dispose 方法卸载 执行销毁控件前的所有最终清理操作。控件作者通常在 Dispose 中执行清除,而不处理此事件。 UnLoad 事件(On UnLoad 方法)

  从这个表里面我们可以清楚的看到一个Page从装载到卸载之间调用的方法和触发的时间,接下来我们就深入的对其进行一些分析。

  看了上面的表,细心的朋友可能要问了,既然OnInit是页面生命周期的开始,而我们在上一讲中谈到控件在子类中被创建,那么在这里实际上在InitializeComponent方法中我们已经可以使用父类中声名的字段了,那么就意味着子类的初始化更在这之前?

  在第三个标题中我们讲到了页面类的ProcessRequest才是真正意义上的页面声明周期的开始,这个方法是由HttpApplication调用的(其中调用的方式比较复杂,有机会单独撰文来讲解),一个Page对请求的处理就是从这个方法开始,通过反编译。Net类库来查看源代码,我们发现在System.Web.WebControls.Page的基类:System.Web.WebControls.TemplateControl(它是页面和用户控件的基类)中定义了一个“FrameworkInitialize”虚拟方法,然后在Page的ProcessRequest中最先调用了这个方法,在生成器生成的ASPX的源代码中我们发现了这个方法的踪影,所有的控件都在这个方法中被初始化,页面的控件树就在这个时候产生。

  接下来的事情就简单了,我们来逐步分析页面生命周期的每一项:

  1、初始化

  初始化对应Page的Init事件和OnInit方法。

  如果要重写,MSDN推荐的方式是重载OnInti方法,而不是增加一个Init事件的代理,这两者是有差别的,前者可以控制调用父类OnInit方法的顺序,而后者只能在父类的OnInit后执行(实际上是在OnInit里面被调用的)。

  2、 加载视图状态

  这是个比较重要的方法,我们知道,对于每次请求,实际上是由不同的页面类实例来处理的,为了保证两次请求间的状态,ASP.Net使用了ViewState.

  LoadViewState方法就是从ViewState中获取上一次的状态,并依照页面的控件树的结构,用递归来遍历整个树,将对应的状态恢复到每一个控件上。


本文引用的地址为IT专家网
文章评论
[以下网友留言只代表其个人观点,不代表中华网的观点或立场]
发表评论
昵 称:
主 页:
内 容:
表 情: