页面被请求时,第一个被执行的老是构造函数(constructor). 你能够在这里初始化不少自定义属性或对象。不过这里有一些限制,由于 page 尚未被彻底初始化。特别地,你必须使用 HttpContext.Current 来访问 QueryString, Form, Cookies 集合,以及 Cache 对象。而 Session 对象在 constructor 里是没法访问的。javascript
下面接着执行的是 AddParsedSubObject 方法,这个方法把组成该 page 的全部子控件添加到控件集合树中。在不少高级的页面模板解决方案中,该方法一般被覆盖,以便把页面的控件添加到一个特殊的页面模板中去。该方法递归的被子控件调用,全部这些子控件都是这时候初始化的,从最里面的开始。html
接着是 DeterminePostBackMode 方法。该方法容许你影响 IsPostBack 的值,以及相关事件。若是你想从数据库中加载 ViewState 以便 redirect 时,这个可能对你有用。由于 ViewState 仅仅在 IsPostBack 为 true 的时候被恢复。
你能够经过返回 null 来强制不 postback, 或者返回 Request.Form 来强制 postback. 这个方法是不推荐使用的,除非是在特殊的状况下,由于他还影响其余的事件。java
而后是 OnInit 方法。一般这是咱们使用到的第一个方法。这时,全部控件已经被初始化,也就是说全部原始值都被设定了。而 ViewState 以及全部其余 post 的值尚未被应用到控件上。也就是说这时候全部经过代码或者用户操做作的更改尚未被恢复。这一般是建立或从新建立动态控件的最佳时机。数据库
恢复和加载(Restore and Load)浏览器
接下来的 LoadPageStateFromPersistenceMedium 方法,仅仅在 PostBack 时被执行。当你要改变保存 ViewState 的方法时(使用 Session 或其余自定义的储存方法),覆盖这个方法,以及后面的 SavePageStateToPersistenceMedium 方法。注意:该方法并不真正加载 ViewState 到 page 及其子控件。服务器
ViewState 被取回后,接着 LoadViewState 方法将它们恢复到 page, 并递归的恢复到每个子控件(只有 PostBack 的那些).这时,每一个控件已经被恢复到了它上次执行时的状态,但用户 post 的值尚未被应用。由于这属于 ViewState. 这个方法是恢复全部在事件中建立的动态控件的最好时机。asp.net
下一个是 ProcessPostData 方法。仅仅在 PostBack 时被执行。并且这个方法不能被覆盖,由于它是页面基类中实现的一个私有方法。这个方法最终将用户 post 的值,经过匹配控件的名称的方法,恢复到页面。这时,page 已经被彻底恢复了。动态控件必须在这个方法以前被建立。这个方法同时也为稍后的 changed 事件记录控件值的改变。函数
而后才是 OnLoad 方法。大部分的代码中都使用这个方法,由于这是在 page 的生命周期中,第一个全部的值都被恢复了的地方。咱们能够经过检查 IsPostBack 属性来避免没必要要的重设状态。同时也能够检查 IsValid 属性来进行验证。同时还能够在这里建立动态控件。全部这些控件的方法都会被执行并捕获,包括 ViewState. 但回发的值不能够。post
Raised Eventsspa
下一个方法,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. 这个方法可覆盖。若是重写的话,注意这里因为 asp.net 的 bug, 须要手工设定一下 __VIEWSTATE,哪怕是空值。
接着是 Render 方法。它递归的调用到每一个子控件,真正的绘制各自的 html, 发送到浏览器。在一些页面模板方案中,经常在这里添加通用的 header 和 footer. 而不用使用服务器控件。 注意在这里能做的更改必须是纯的 html. 由于这时候控件都已经绘制完了。
最后是 OnUnload 方法。它调用了 Dispose 方法。这个方法能够用来清理页面中使用的非托管资源。特别是相似于关闭打开的文件或数据库链接等。该方法只有当页面已经被发送到客户端浏览器后才发生。因此它只能对服务端的对象起做用。因此他不能在 page 的 trace 中被显示。
上面就是 page 的生命循环。每次有一个新的请求时,以上过程就重复一次。