页面事件的顺序和返回 -- [翻译]

原文地址: http://aspalliance.com/articleViewer.aspx?aId=134&pId=

实例化
当一个页面被请求所执行的第一个方法总是构造器。虽然这时候由于页面还没完全初始化而会产生一些限制,但你可以实例化许多页面中的自定义的属性或对象。特别是,你能通过HttpContext.Current对象来访问Request QueryString,  Form,Cookies集合和Cache对象。然而,在构造器中无法访问Session集合。

下一个被执行的事件是 AddParseSubObject方法,它实际上是将所有组成页面的单独控件加到控件树中。为了把页面内容加到页面模板中的特定控件中,这个方法在一些高级页面模板解决方案中被典型地重载。这个方法将被页面控件中的每个子控件递归地调用,每个这种控件将从最里层开始被初始化。

下一个被执行的页面类中的方法是 DeterminePostBackMode。这个方法允许你响应IsPostBack的值和所有相关的事件,如果你需要为了重定向而从数据库中导入ViewState的话那将会是有用的,因为ViewState只有在IsPostBack是true时才能被恢复。由于它将影响其它的事件,所以除了在一些特殊的场合外,不推崇仅仅为了强制不要PostBack而返回一个null和为了强制PostBack而返回Request.Form。

接下来执行的事件是页面 OnInit方法,它通常是第一个被用到的方法。到这个时候,所有在页面中定义的控件将被初始化,这意味着所有在aspx页面中指定的原始值将被应用。但是ViewState和任何提交的值还没有应用到控件,所以任何代码或是用户改变的值还没有被恢复。这通常是创建和重新创建动态控件的好地方。

恢复和加载
下个方法是只有在PostBack时才执行的 LoadPageStateFromPersistenceMedium。当你改变了后来的 SavePageStateToPersistenceMedium方法中用Session或自定义储存方法保存的页面ViewState时,这个方法将重载。缺省的执行假定ViewState是64基数编码的隐藏表单域,但是这可以在这两个方法中用和这篇相关文章中的代码来改变。注意这个方法实际上没有恢复ViewState到页面或页面控件。

在重新得到ViewState后,下个方法也是只有在PostBack后执行的LoadViewState,它恢复ViewState到页面和递归到每个控件及他们的子控件。在这个执行后,每个控件将恢复到上次的状态,但是用户提交的值还是没有应用,因为这不是ViewState的一部分。这个方法最好的用途是恢复任何你在事件中必须基于在ViewState中手工保存的值来创建的动态控件,现在这个控件可以用了。

下一个方法是只有在PostBack时才执行的 ProcessPostData,由于是页面基类执行的私有方法,所以不能重载。这个方法最后用控件的名值对恢复用户表单中提交的值,这意味着页面将最终完全的恢复。唯一要捕捉的是动态控件必须在这个页面方法之前创建。这也是为之后改变事件中记录改变值的方法。

下个执行的是页面的OnLoad方法,由于它是页面生命周期中所有值都恢复的第一个地方,所以通常在这个方法中编大部分代码。大部分代码为了避免不必要的重新设置都要检查是否是IsPostBack。你可以在这个方法中调用Validate方法来检查页面是否有效。你同样可以在这个方法中创建动态控件,所有控件的方法包括ViewState将会为了赶上父控件而被执行,但是提交的值不能恢复。

引发的事件
下一个方法是先前的 ProcessPostData的第二次执行,它仍然只有在PostBack后执行而且由于是私有的方法而不能重载。当你第一次在页面trace中注意到它执行两次时,会觉得奇怪,但那是因为在Onload方法中重新创建的动态控件需要它们提交的值。任何在这个方法后动态创建的控件,虽然能恢复ViewState,但是不能得到他们提交的值并且不能触发任何改变事件。

下一个方法是 RaiseChangedEvents,它同样在PostBacks后执行,而且也是由于是页面基类的私有方法而不能重载。这是页面生命周期中改变事件基于在ProcessPostData方法中标注的提交值前后的不同而真正引发的时候。你同样可以调用Validate方法和检查是否有效。这儿没有对改变事件引发顺序的保证。

下一个方法是 RaisePostBackEvent,它同样在PostBacks后执行,而且也是由于是页面基类的私有方法而不能重载。这儿是除了自动提交外真正提交表单事件引发的地方,典型的像按钮或用Javascript提交表单。如果不是已经手动地提交,当用到验证控件时,Validate是被调用的。注意到一个IE的bug,有时候允许回车键提交表单时不触发事件。

下一个执行的页面方法是 OnPreRender,它是在页面呈现到客户端浏览器前最后一次影响页面和它的控件的机会。你同样可以在这个方法中创建动态控件,所有这个控件的方法将为了追赶而被执行,包括ViewState,但是先前的私有方法将不会执行另一个,这意味着不会恢复这个控件的提交值也不会引发这个控件的事件。由于IE的bug,这是个捕捉没有事件的PostBack的好地方。

保存和呈现
下一个执行的方法是不管是否PostBack的 SaveViewState,这个方法被每个控件和它的子控件递归执行来产生ViewState。ViewState主要是保存不论是在代码中改变还是用户改变的不同于原始在aspx页面中定义的属性值。注意控件值是根据它们在控件树中的位置而被保存的,所以如果动态控件后来加在错误的地方,ViewState可能会被破坏。

下一个方法是保存页面ViewState的 SavePageStateToPersistenceMedium。为了用Session或自定义存储方法来替代隐藏域保存ViewState,这个方法将连同LoadPageStateFromPersistenceMedium一起被重载。这对于低带宽的方案来说是有用的,移动页面默认的是Session。看在相关文章中查到的有关用这两种方法的详细信息的代码,注意在ASP.NET中的一个bug要求发送一个_VIEWSTATE隐藏域,即使它是空的。

页面的 Render方法随后执行,所有控件和它的子控件递归执行这个方法,最终产生和发送html到浏览器。在一些页面临时解决方案中这个方法用来不用服务器端控件添加通常的页头和页脚,这通常会有些额外的开销。注意因为控件这时已经生成好了,所以在这儿的改变必须是纯html的。你可以用StringBuilder,StringWrite和HtmlTextWriter来捕获输出的html。

真正最后一个执行的方法是 OnUnload,它同样调用Dispose方法。这个方法让你在清除页面中没用的资源,典型的是关闭任何打开的文件或是关闭先前打开的数据库连接。注意这个方法只有在页面已经发送到客户端的浏览器后才执行,所以它只影响服务器端的对象,而且不会在页面trace中出现。这就是页面的生命周期--每次新的请求所有事情都将重新执行一遍。

Listing 1: Page Events Summary
 
 

MethodPostBackControls

ConstructorAlwaysAll
AddParsedSubObjectAlwaysAll
DeterminePostBackModeAlwaysPage
OnInitAlwaysAll

LoadPageStateFromPersistenceMediumPostBackPage
LoadViewStatePostBackAll
ProcessPostData1PostBackPage
OnLoadAlwaysAll

ProcessPostData2PostBackPage
RaiseChangedEventsPostBackPage
RaisePostBackEventPostBackPage
OnPreRenderAlwaysAll

SaveViewStateAlwaysAll
SavePageStateToPersistenceMediumAlwaysPage
RenderAlwaysAll
OnUnloadAlwaysAll



其他相关文章:
http://authors.aspalliance.com/aldotnet/examples/plediagram.htm
http://msdn.microsoft.com/asp.net/default.aspx?pull=/library/en-us/dnaspp/html/aspnet-pageobjectmodel.asp
http://weblogs.asp.net/eporter/archive/2003/07/15/10109.aspx
http://pluralsight.com/blogs/fritz/archive/2004/11/17/3544.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RESTful是一种设计风格或原则,用于构建Web应用程序的后端服务。在使用RESTful架构时,一般按照以下顺序来设计和组织各个层: 1. 用户界面层:这是与用户进行交互的界面层,可以是Web页面、移动应用程序或其它客户端。用户通过界面层与后端服务进行通信。 2. 资源层:资源层是RESTful架构的核心,它代表了应用程序中的实体或对象,例如用户、订单、产品等。每个资源都通过唯一的URI来标识。 3. 控制器层:控制器层是资源层和服务层之间的桥梁,负责接收来自用户界面的请求并调用相应的服务。控制器将请求的HTTP方法和URI映射到相应的服务方法。 4. 服务层:服务层包含了实际处理业务逻辑的代码,它封装了对资源的具体操作,例如创建、读取、更新和删除。服务层接收到控制器的请求后,通过调用数据访问层来读取或更新数据库中的数据。 5. 数据访问层:数据访问层负责与数据库或其它数据存储系统进行交互,提供读取和更新数据的接口。数据访问层将服务层的请求翻译为对数据库的操作,并将查询结果返回给服务层。 6. 数据库层:数据库层是实际存储数据的地方,可以是关系型数据库(如MySQL)或非关系型数据库(如MongoDB)。它负责数据的持久化和管理,将数据存储在硬盘上,并提供灵活的查询和事务处理功能。 通过以上的层次划分,RESTful架构可以实现前后端分离、松耦合的设计思想,使得不同层次的组件可以独立开发、部署和维护,提高了系统的可扩展性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值