暂态
2006-04-26 15:39 努力学习的小熊 阅读(991) 评论(0) 编辑 收藏 举报在很多情况下,您都希望状态能够持续于整个请求期间,然后再完全自动删除。在这种情况中,特别是当控件处于独立的类时,您需要在页面间、甚至在页面处理的不同阶段的控件间传递数据。在这些情况下,需要找到一个在它们之间传递数据的合适方法,这个方法仅需延长处理当前页面请求的时间即可。
利用会话状态并不是一个很好的解决方案,因为这样会为一个根本不需要延长会话时间的状念浪费服务器资源。即便可以在元素处理完中之后对其手动删除,从而保留这些资源,但如果会话状态被设置为存储在独立的状态服务器或SQL Server中,就会遭受相应的性能冲突。
ASP.NET提供了一个HttpContext类,该类用以表示当前请求的上下文。我们已经了解到如何利用这个类提供的属性,即用HttpContext.Current.Session和HttpContext.Current.Application属性,来访问应用程序状态或会话状态。而是,这个类的实例可以作为Control类的属性使用,Page和所有的服务器控件都派生于Context。
除了这些属性,context对象中还有—个Items属性,它可以保存任何类型的数据。无论在这个属性中放置了什么内容,都会在请求处理结束后被自动删除。这就是我们称之为暂态的原因,也就是说,因为它不像会话、应用程序、视图状态和cookies那样能够持续保存,稍后我们将讲到这些内容。
Context.Items["selected"] = ViewState["selected"];
Server.Transfer("RequestContact.aspx");
注意,这里使用的是Server.Transfer ()方法而不是Response.Redirect()。利用这个方法,ASPNET可以把处理过程交给特定的页面去完成,面不是结束当前执行的上下文或请求,请求更可能被发送到目标贞面。由于处理转换发生在服务器端,所以客户浏览器并不知道发生了什么事情,这就是URL在转换之后保持不变的原因。
单击Request Contact按钮后就把当前页面选中的用户ID存储在Context.Items中,通过Server.Transfer方法传递到下一个页面处理。
URL没有改变。
现在我们可以清楚地了解暂态的实用性,不过,如果被传递的数据更加复杂一些,暂态的优势会更加明显,比如被传递的是一个数据集或者是一个复杂的对象层次结构图。它不会遇到任何有关复杂数据集的视图状态性能问题(不管是在客户端还是服务器端),因为它能够传递任何类型的数据;同时,出为它会在请求完成处理过程后进行自动删除,所以它也不会像会话状态那样对服务器的可伸缩性强加任何威胁。基于这种情况,把值保存到请求中是很不明智的;这就是我们称它为暂态的原因。