Asp.net生命周期
注:文章翻译来源
http://www.codeproject.com/KB/aspnet/ASPNET_Page_Lifecycle.aspx
纯属业余爱好,如有侵犯版权的行为,请告知,我将会尽快处理.
简介
对于asp.net开发人员来说,不论什么原因,理解并且清晰地掌握aps.net生命周期是非常重要的,当然这不仅仅只是知道如何正确的使用这些方法,或者说是了解页面属性在什么时候被设置.然而,让人感到为难的是,在页面周期中,要是搞明白并且记住所有的这些可用的方法将是十分困难的.网上有成堆的文章来介绍页面生命周期的根本特性,这些文章一开始就是先将基础内容介绍一遍,然后会举出一个简单并且容易理解的用处来说明页面生命周期.
在asp.net页面生命周期中,能够清晰地了解它的内部发生了什么,这将是十分困难的.想记住这些,通常最简单的方法就是利用同义词来辅助记忆.微软已经为我们列举出了asp.net生命周期,如下所示:
1、 Page Request
2、 Start
3、 Page initialization
4、 Load
5、 Validation
6、 Postback event handing
7、 rendering
8、 unload
上面的这些过程利用同义词来表示,那就相当的容易理解了.由于page Request过程从技术上来说并不能算作是页面请求的一部分(它只用于作为我们是否开始页面请求或者是加载缓存页面的标志),所以我们不会将它包括到同义词描述中来.
◎ S (start)
◎ I (Initialize)
◎ L (Load)
◎ V (Validate)
◎ E (Event Handling)
◎ R (Render)
从上面的组合中,我们可以发现这个单词”SILVER”(英文意思为”银色的”),看看,是不是很好记忆了.然而需要注意的是,页面请求的最后一部分是Unload方法,所以你可以利用”SILVER-U”或者是”SILVER-YOU”来进行记忆(如此一来,的确变得有些别扭了哈).现在来看看,是不是可以非常容易记忆了?下面我们将来看看在这些过程中内部发生了什么,什么事件被触发.
1、 Start
在这个过程中,页面属性被设置,比如说Request,Response,IsPostBack以及UICulture。作为一个开发者,你极有可能用不到这个过程。如果在这一步,你需要访问或者是覆写本方法,你可以利用PreInit方法来创建一个或者是动态的控件,然后给它指定主页面或者是主题或者是添加属性方法。需要注意的是,如果请求需要进行回调,那么这些控件的值是不能够在viewstate中被缓存的。所以如果你在这个过程中设置了控件的属性,它的有可能在下一个过程中被覆写。
2、 Initialize
本阶段对于开发者来说是非常重要的。因为这个时候,页面的主题被加载,页面上的控件都已经获得了唯一的ID值。开发者在这个阶段可以访问Init,InitComplete以及PreLoad方法。微软为这些方法力荐的用法如下:
※Init 本事件发生于页面上所有的控件都被初始化并且所有的主题样式都被加载之后,这个时候,可以用它来访问或者是初始化控件的属性。
※InitComplete 本事件发生于Page中,用这个事件处理页面任务,但是要求所有的初始化都已经完成才行.
※PreLoad 如果你想在事件加载之前处理页面或者是控件,那么你可以使用这个方法.当页面加载这个事件之后,他将会为自己和所有的控件加载viewstate,然后处理所有的回调数据,包括请求实例.
3、Load
本阶段可能是最重要的阶段。在这个阶段,所有的控件都从视图和控件状态中获取了信息。Onload事件中的方法在这个阶段将将被触发,同时Onload事件也是你为所有的服务器端设置属性,处理请求,初始化数据库连接的时候。
4、Validateion
在本阶段,如果你有空间需要验证,那么你就可以在这里进行操作了。这个时候你可以检查空间的属性是否是可用的。这个阶段触发的事件为Validate方法,它包含一个可以接收验证队列的重载方法,这个重载方法将控件放到验证队列中进行验证。
5、Event Handling
本阶段,服务器端的事件将会触发。这就意味着Click,SelectedIndexChanged等事件将会注册到服务器端控件上面去,同时,这些服务器端触发的事件将会产生回调,本阶段的可以使用的事件如下:
※LoadComplete 本步骤中,所有的空间将会被加载。
※ProRender 本步骤中,只有极少的重要的操作被触发。首先就是,页面会为每个控件调用EnsureChildControls,在页面调用完成后,任何一个数据绑定控件将会获得DataSourceID,并且调用自身的DataBind方法进行数据绑定。需要注意的是,PreRender事件作用于页面上的所有控件。在这个事件结束的时候,viewstate将会保存页面上所有控件的信息。
※SaveStateComplete ViewState已经被保存。如果你不需要控件变化,而只是想保存其ViewState,那么你可以触发这个SaveStateComplete事件.
6 Render
说实话,Render并不能真正意义上的算上是一个事件.然而,当页面需要输出HTML标记的时候,它会会在每个控件上调用这个方法.这个阶段对于需要创建本地化的控件的开发者来说是非常重要的,因为这个标准的创建过程就是重载Render方法.如果你的控件继承自一个标准的asp.net服务器端控件,那么你可能不需要重载Render方法,除非你想让控件展现出不同的行为.如何进行展现,这是本文讨论的范围之外.你可以进行一个扩展阅读,比如你可以查阅微软的一些开发本地化服务器控件的文章
(http://msdn2.microsoft.com/en-us/library/zt27tfhy.aspx)
7 Unload
最后一个事件将会发生于每一个控件之上,然后,一直到结束.这时,所有的控件将会输出流并且不能够再被改变.在这个事件中,任何试图访问应答流的方法将都会出现错误.这个事件主要被用来清除善后工作,比如说数据库连接,打开的文件流,事件日志,或者其他的任务等等.
方法
下面的方法(均可以被重写)均在asp.net页面周期中被一一触发.需要注意的是,有些方法是被递归地进行调用的,调用的次数取决于页面的内容.下面的列表是用来展现 当一个页面加载的时候,事件发生的先后顺序的.你可以通过创建一个默认的asp.net程序来测试这些方法,你可以重载下面的每一个方法,然后加上断点进行调试.
- Construct
- ProcessRequest
- FrameworkInitialize
- InitializeCulture
- 如果需要子控件
- AddParsedSubObject
- CreateControlCollection
- AddedControl
- ResolveAdapter
- DeterminePostBackMode
- OnPreInit
- OnInit
- TrackViewState
- OnInitComplete
- OnPreLoad
- OnLoad
- OnLoadComplete
- EnsureChildControls
- CreateChildControls
- OnPreRender
- OnPreRenderComplete
- SaveViewState
- OnSaveStateComplete
- CreateHtmlTextWriter
- RenderControl
- Render
- RenderChildren
- VerifyRenderingInServerForm
- OnUnload
- Dispose
结论
当开发asp.net程序的时候,了解并且熟练运行这些事件发生的顺序将会帮助你节约时间,省去调试的麻烦.然而这些方法触发的顺序可能会难于记忆,我只希望这些方法将会非常容易的使用.
我写这篇文章,只是为了帮助别人,同时也是帮助我自己.一些经验甚丰的开发者也难免会忘记这些顺序,记下来,还是经常看看吧
Happy ASP.net’ing!