视图状态是 ASP.NET 页面中的一个仓库,用来存储需要在回传过程期间被保持的状态值。例如,你能够在页面下一次被发送到服务器的时候,在载入事件期间把将要被访问的信息存储到视图状态中。关于使用建议,请参考:[ASP.NET 状态管理的建议]。
视图状态是基于 64 位编码的字符串,并且被存储在页面的若干隐藏字段中。你能够使用页面的 ViewState
属性来访问视图状态信息,该属性暴露了一个字典对象。因为视图状态中的数据是被当作字符串进行存储的,所以只有能够被序列化的对象才能被存储到视图状态中。
提示:要使用 ViewState
属性,ASP.NET Web 页面必须包含一个拥有 runat="server"
参数的窗体元素。关于使用建议,请参考:[ASP.NET 状态管理的建议]。
在页面的代码中,设置 ViewState
属性中的变量值。
如下代码实例说明了如何从视图状态中获取一个名为 arrayListInViewState 的 ArrayList
对象,然后把一个 GridView
控件作为数据源绑定到该对象。
'Visual Basic 实例: Dim arrayList As ArrayList arrayList = CType(ViewState("arrayListInViewState"), ArrayList) Me.GridView1.DataSource = arrayList Me.GridView1.DataBind()
arrayList = new ArrayList(); arrayList = (ArrayList)ViewState["arrayListInViewState"]; this.GridView1.DataSource = arrayList; this.GridView1.DataBind();
视图状态中的值是 String
类型。在 Visual Basic 中,如果你设置了 Option Strict On
指令,你必须在使用视图状态值之前把它们转换成适当的类型,如下实例所示。在 C# 中,你应该在读取视图状态值的时候始终进行适当的类型转换。
在尝试获取一个在视图状态中并不存在的值的时候并不会抛出任何异常。要确认你所需要的值是否存在于视图状态中,就需要先对现有的对象进行检查并测试是否存在,如下所示:
if (ViewState["color"] == null) // 视图状态中没有这个值,执行适当的运作。
如果你尝试通过其他的方式(例如,对类型的检查)来使用视图状态中并不存在的子项,将会抛出一个 NullReferenceException
异常。
被存储的视图状态信息使用了基于 64 位的编码,并且在呈现期间被包括在页面中,从而增加了页面的尺寸。在页面被回传的时候,视图状态会作为页面回传信息的一部分而被发送。因为视图状态能够增加网络流量并减慢网络连接的速度,所以建议你不要在视图状态中存储庞大的信息量。
另一个重要的考虑就是一旦页面中隐藏字段的数据量变得庞大,有些代理和防火墙将会限制对这些页面的访问。这是因为对于隐藏字段中数据量的限制能够随着不同的防火墙和代理的实现而变化,庞大的隐藏字段能够引起不可预知的行为。关于更多信息,请参考:[ASP.NET 状态管理的建议]。
有些移动设备不允许使用任何隐藏字段。因此,视图状态将无法在这些设备中运作。关于更多信息,请参考:[ASP.NET 移动设备应用程序开发概览]。
视图状态中的信息基于 64 位格式的编码,但是它能够被恶意用户所篡改。你应该把被存储在视图状态中的信息当成用户所提供的数据一样来对待并始终在使用之前进行验证。关于缓解视图状态安全风险的更多信息,请参考:[保护视图状态]。关于保护 ASP.NET 应用程序的常规信息,请参考:[保护 ASP.NET Web 应用程序和 Web 应用程序的基本安全练习]。