3.3 页面的生命周期每次客户端请求都会创建页面实例,它的执行使自身及其包含的控件经历页面生命周期的各个阶段。页面的执行起始于HTTP运行库调用ProcessRequest时,该方法将启动页面并控制它的生命周期。生命周期由一系列阶段和步骤组成。一些阶段可以通过用户编码的事件进行控制,而一些需要对方法进行重写。其他阶段(更确切地说是子阶段)没有被公开,因而开发者无法控制。 页面的生命周期可以分为三个阶段:建立阶段、回发阶段和终结阶段。每个阶段会有子阶段,分别由若干步骤和事件引发点组成。这里描述的生命周期包括所有可能的路径。注意,具体情况会因返回过程(跨页投递、脚本回调和回发)的不同而略有不同。 3.3.1 页面的建立当HTTP运行库实例化一个页面类对当前请求进行处理时,页面的构造函数会生成一个控件树。该控件树会关联至实际的类,这些类是由页面解析器在扫描ASPX源代码后创建的。值得一提的是,当请求的处理过程开始时,所有子控件和页面的内部对象(如HTTP上下文对象、请求对象和响应对象等)都会被设置。 页面生命周期的第一个阶段是确定运行库处理当前页面请求的原因。这个原因有很多种:常规请求、回发、跨页投递或回调。基于实际的原因,页面对象会配置其内部状态,如果包含被投递的值,还会根据请求的方法(GET或POST)准备该值的集合。在第一个阶段过后,页面便为引发事件来执行用户代码做好了准备。 PreInit事件这是ASP.NET 2.0引入的事件,它是页面生命周期的入口点。该事件被引发时,页面尚未与母版页和主题相关联。但页面滚动条位置已被恢复,被投递的数据变为可用,且所有的页面控件已被实例化,其属性也已基于在ASPX源中的默认值进行了设置(注意,如果没有在.aspx源中显式指定,这时的控件是没有ID的)。在这个阶段中,可以对母版页进行调换,或对主题进行编程。该事件仅对页面有效。IsCallback、IsCrossPagePostback和IsPostBack会在这时被设置。 【132】 Init事件在这个阶段,母版页和主题(如果分别存在)会被设定,不能再被更改。页面处理程序(即Page类的ProcessRequest方法)开始执行,对所有子控件进行迭代,使其有机会在上下文环境下初始化它们的状态。所有子控件都有自己的OnInit方法,后者以递归方式被调用。对于控件集合中的每个控件,都设置有命名容器和特定ID(如果没有在源中分配)。 Init事件首先会处理子控件,然后是页面。在这个阶段,页面和控件通常开始加载其部分状态。此时,视图状态尚未被恢复。 InitComplete事件该事件是ASP.NET 2.0引入的,页面专有,用于指示初始化子阶段的结束。对于页面来说,在Init和InitComplete事件之间只有一个操作会执行——启用视图状态的变更跟踪功能。视图状态的跟踪是这样的一种操作,它最终使控件能够真正地将所有以编程方式添加到ViewSatae集合中的值,存储在持久性介质中。简而言之,对于没有实施视图跟踪的控件,添加到其ViewState中的值将在回发间丢失。 在控件引发各自的Init事件后,视图状态跟踪会立即启动,页面也不例外(归根结底,页面也是一种控件)。 要点:对于上述说明,有一点需要注意:在InitComplete前,任何写入ViewState集合的 值,在下一次回发时都不再可用。对于ASP.NET 1.x,必须等待Load事件被引发,才能安全地更改页面和控件的视图状态。 视图状态的恢复如果页面因回发而被处理(即,IsPostBack属性为true),隐含字段__VIEWSTATE的值会被恢复。隐含字段__VIEWSTATE用于在请求结束时,保存所有控件的视图状态。页面的整体视图状态是一种调用上下文,包含页面每个组成控件上一次发往浏览器的状态信息。 在这个阶段,每个控件会获得更新其当前状态的机会,恢复其上一次请求时的状态。视图状态的恢复过程不会引发任何事件。如果需要对此进行定制,则必须借助于LoadViewState方法的重写(该方法在Control类中为受保护的虚拟成员)。 【133】 处理被投递的数据 HTTP请求中打包的所有客户端数据(即所有定义在
页面的生命周期
最新推荐文章于 2024-09-02 12:41:22 发布