生命周期

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Aspx页面生命周期(转)

阶段说明

页请求页请求发生在页生命周期开始之前。用户请求页时, 将确定是否需要分析和编译页(从而开始页的生命周期),或者是否可以在不运行页的情况下发送页的缓存版本以进行响应。

开始在开始阶段,将设置页属性,如Request和Response。在此阶段,页还将确定请求是回发请求还是新请求,并设置IsPostBack属性。此外,在开始阶段期间,还将设置页的UICulture属性。

页初始化页初始化期间,可以使用页中的控件,并将设置每个控件的UniqueID属性。此外,任何主题都将应用于页。如果当前请求是回发请求,则回发数据尚未加载,并且控件属性值尚未还原为视图状态中的值。

加载加载期间,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。

验证在验证期间,将调用所有验证程序控件的Validate方法,此方法将设置各个验证程序控件和页的IsValid属性。

回发事

件处理

如果请求是回发请求,则将调用所有事件处理程序。

呈现在呈现之前,会针对该页和所有控件保存视图状态。在呈现阶段中,页会针对每个控件调用Render方法,它会提供一个文本编写器,用于将控件的输出写入页的Response 属性的OutputStream中。

卸载完全呈现页并已将页发送至客户端、准备丢弃该页后,将调用卸载。此时,将卸载页属性(如Response和Request)并执行清理。

页面被请求时,第一个被执行的总是构造函数(constructor). 你可以在这里初始化很多自定义属性或对象。不过这里有一些限制,因为page 还没有被完全初始化。特别地,你必须使用HttpContext.Current 来访问QueryString, Form, Cookies 集合,以及Cache 对象。而Session 对象在constructor 里是无法访问的。下面接着执行的是AddParsedSubObject 方法,这个方法把组成该page 的所有子控件添加到控件集合树中。在很多高级的页面模板解决方案中,该方法通常被覆盖,以便把页面的控件添加到一个特殊的页面模板中去。该方法递归的被子控件调用,所有这些子控件都是这时候初始化的,从最里面的开始。接着是DeterminePostBackMode 方法。该方法允许你影响IsPostBack 的

值,以及相关事件。如果你想从数据库中加载ViewState 以便redirect 时,这个可能对你有用。因为ViewState 仅仅在IsPostBack 为true 的时候被恢复。你可以通过返回null 来强制不postback, 或者返回Request.Form 来强制postback. 这个方法是不推荐使用的,除非是在特殊的情况下,因为他还影响其他的事件。然后是OnInit 方法。通常这是我们使用到的第一个方法。这时,所有控件已经被初始化,也就是说所有原始值都被设定了。而ViewState 以及所有其他post 的值还没有被应用到控件上。也就是说这时候所有通过代码或者用户操作做的更改还没有被恢复。这通常是创建或重新创建动态控件的最佳时机。恢复和加载(Restore and Load) 接下来的LoadPageStateFromPersistenceMedium 方法,仅仅在PostBack 时被执行。当你要改变保存ViewState 的方法时(使用Session 或其他自定义的储存方法),覆盖这个方法,以及后面的SavePageStateToPersistenceMedium 方法。注意:该方法并不真正加载ViewState 到page 及其子控件。ViewState 被取回后,接着LoadViewState 方法将它们恢复到page,并递归的恢复到每一个子控件(只有PostBack 的那些).这时,每个控件已经被恢复到了它上次执行时的状态,但用户post 的值还没有被应用。因为这属于ViewState. 这个方法是恢复所有在事件中创建的动态控件的最好时机。下一个是ProcessPostData 方法。仅仅在PostBack 时被执行。而且这个方法不能被覆盖,因为它是页面基类中实现的一个私有方法。这个方法最终将用户post 的值,通过匹配控件的名称的方法,恢复到页面。这时,page 已经被完全恢复了。动态控件必须在这个方法之前被创建。这个方法同时也为稍后的changed 事件记录控件值的改变。然后才是OnLoad 方法。大部分的代码中都使用这个方法,因为这是在page 的生命周期中,第一个所有的值都被恢复了的地方。我们可以通过检查IsPostBack 属性来避免不必要的重设状态。同时也可以检查IsValid 属性来进行验证。同时还可以在这里创建动态控件。所有这些控件的方法都会被执行并捕获,包括

ViewState. 但回发的值不可以。Raised Events 下一个方法,ProcessPostData 方法,实际上是前面那个方法的第二个入口(second pass)。它仅仅处理回发,而且由于是私有方法,所以不能被覆盖。这个方法显得有些奇怪,但又是必要的。因为在OnLoad 方法中重建的动态控件需要他们回发的值。所有在这个方法之后创建的动态控件,将只能恢复ViewState, 而不能恢复回发的值,并且不能触发任何更改事件。下一个方法,RaiseChangedEvents,同样仅仅用于回发时。它是一个基类实现的私有方法。这时changed 事件被真正触发。这基于前面ProcessPostData 方法中标注出回发的值的差异。当有多个changed 事件被触发时,其先后顺序是没有保证的。下面是RaisePostBackEvent 方法。仅用于回发,而且是基类实现的私有方法。这是真正提交form 的方法,除非是postback。比如按钮,或者其他通过javascript 提交的控件被触发。如果使用了Validators, 如没有手动调用Validate 方法,这时也已经被调用了。有时候ie 的bug 会使得表单被提交,而不引发事件。接着是OnPreRender 方法。这通常是在被绘制到浏览器之前,要更改page 及其子控件的最后机会。你也可以在这里创建动态控件。但这时只能捕获ViewState, 而不能接受posted values,而且没有事件。因为上面提到的ie 的bug, 这里可以用来捕获没有触发事件的post back. 保存和绘制(Save and Render) 下一个是SaveViewState 方法。不管是否post back. 递归的应用到每一个子控件。ViewState 一般保存所有和aspx 页面里不一样的属性,不管是被代码还是用户更改的。注意,由于控件的值是通过他们在控件树中的位置来保存的,所以如果在这之后添加动态控件到错误的位置,ViewState 可能会崩溃。下面是SavePageStateToPersistenceMedium 方法。它真正的保存page 的ViewState. 这个方法可覆盖。如果重写的话,注意这里由于 的bug, 需要手工设定一下

__VIEWSTATE,哪怕是空值。接着是Render 方法。它递归的调用到每个子控件,真正的绘制各自的html, 发送到浏览器。在一些页面模板方案中,常常在这里添加通用的

相关文档
最新文档