ASP.NET状态管理概述之视图状态(ViewState)
本人初学ASP.NET,在阅读了一些材料后,整理一下。ASP.NET状态管理基本上有8种途径,视图状态;控件状态;Hidden Fileds(隐藏域);Cookie;查询字符串;应用程序状态;Session State;配置文件属性。需要指出的是后三种方法是在服务器端保存状态的。每个方案都有优缺点,具体选择取决于响应的方案。
好话不多说,To the point directly。
视图状态(ViewState)属性提供一个字典对象,用于同一页面的多个请求之间保留值,这是页面在往返之间保留状态的默认方法。是在ASP.NET2.0之后对服务器端控件而言的,若要使用 ViewState 属性,ASP.NET 网页必须有一个具有 runat="server" 特性的 form 元素。每当用户请求某个.aspx页面时,.NET框架首先把相关控件的状态数据序列化成一个字符串,然后,将其做为名为__VIEWSTATE的隐藏域的Value值发送到客户端。如果页面是第一次被请求,那么服务器控件也将是被第一次执行时,名为__VIEWSTATE的隐藏域中只包含控件的默认信息,通常为空或者null。在随后的回送事件中,ViewState中就保存了服务器控件在前面回送中可用的属性状态。这样服务器控件就可以监视在当前被处理的回送事件发生之前的状态了。这些过程是由.NET框架负责TrackViewState、aveViewState、LoadViewState等,视图状态管理过程都是由.NET框架自动完成的。对用户来说是执行.aspx页面就有了持续执行的效果。
视图状态的存储数据类型是object类型的,get set状态信息
{
object o = ViewState["Text"];
return (o == null)? String.Empty : (string)o;
}
set
{
ViewState["Text"] = value;
}
使用视图状态时,对象必须先序列化,然后再通过回传进行反序列化。序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,就使得数据能够被轻松地存储和传输。默认情况下,控件的ViewState将被启用,如果不需要使用ViewState,最好还是将它关闭。以下情况将不再需要ViewState:(1)控件未定义服务器端事件(这时的控件事件均为客户端事件且不参加回送的);(2)控件没有动态的或数据绑定的属性值。关闭视图状态的方法是将控件的EnableViewState的值设置为"false",即EnableViewState="false"。默认情况下,视图状态的有关内容在编译运行发送给客户端时,读者将在页面的HTML代码中看到__VIEWSTATE隐藏域内容。这是一些没有意义的字符串,是.NET框架通过Base64位编码对相关内容编码的结果。它们是通过明文方式在客户端和服务器端之间往返传送。在某些情况下,例如涉及密码、账号、连接字符串等敏感内容时,使用默认方式是很不安全的为此,.NET框架为ViewState提供了两种安全机制:校验和加密机制具体怎样实现的在此不再赘述。
以上内容介绍了视图状态的一些基本知识。然而,可能部分读者会有些疑惑:如果在某些情况下,视图状态数据变得很大,那怎么办呢?这样显然会出现一些意想不到的后果。为此,ASP.NET 2.0新增了一种名为"视图状态分块"的功能。如果视图状态的数据量变得太大,视图状态分块自动将数据分成多个块区,并将这些数据放在多个隐藏形式的字段中。
若要启用视图状态分块,可将MaxPageStateFieldLength属性设置为在单个视图状态字段中允许的最大大小(以字节为单位)。当该页回发到服务器时,该页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。默认设置是-1,这表示不存在最大大小,不会将视图状态分成多个块区。
优点和缺点
使用视图状态具有以下3个优点:一、耗费的服务器资源较少(与Application、Session相比)。因为,视图状态数据都写入了客户端计算机中。二、易于维护。默认情况下,.NET系统自动启用对控件状态数据的维护。三、增强的安全功能。视图状态中的值经过哈希计算和压缩,并且针对Unicode实现进行编码,其安全性要高于使用隐藏域。
使用视图状态具有以下3个缺点:一、性能注意事项。由于视图状态存储在页本身,因此如果存储较大的值,即使在视图状态分块的情况下,用户显示页和发送页时的速度仍然可能减慢。二、设备限制。移动设备可能没有足够的内存容量来存储大量的视图状态数据。因此,移动设备上的服务器控件时,将使用其他的实现方法。三、潜在的安全风险。视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希格式存储数据,但它可以被篡改。如果直接查看页输出源,可以看到隐藏域中的信息,这导致潜在的安全性问题。
。。。待续
浙公网安备 33010602011771号