ASP.NET 状态视图概览

Web 应用程序是无状态的。服务器中的页面在每一次被请求的时候都会创建 Web 页面类的新实例。这通常意谓着所有与页面和控件相关联的信息在每次回传过程中都将被丢失。例如,如果用户在某个 HTML Web 页面的文本框中输入信息,那么该信息就会被发送到服务器,但是不会再次返回到客户端。要克服 Web 开发中这个固有的局限性,ASP.NET 页面框架包括了几个状态管理特征,其中一个就是视图状态,用于从浏览器到 Web 服务器的回传过程之间保持页面和控件的值。更多关于状态管理的信息,请参考:[ASP.NET 状态管理概览]。

视图状态是 ASP.NET 页面框架用于在回传过程中保持页面和控件值时的默认方式。在页面的 HTML 被呈现之后,需要在回传期间被保持的当前页面状态会被序列化到基于 64 位编码的字符串中并且输出到视图状态的隐藏字段或隐藏字段集中。你可以改变默认的行为并把视图状态存储到另一个位置(如通过实现自定义的 PageStatePersister 类来存储页面数据的 SQL Server 数据库)中。关于胜于在隐藏页面字段中存储页面状态的数据流存储方式的实例,请参考:[PageStatePersister 类]中的实例。

在朝 Web 服务器的回传过程期间,你可以在代码中使用页面的 ViewState 属性来保持数据。ViewState 属性是一个由包含视图状态数据的 Key/Value 数据对所组成的字典。

安全提示:恶意用户能够轻松地查看并更改隐藏字段的内容。更多关于视图状态数据的信息,请参考:[保护视图状态]。

关于应该何时在视图状态中存储信息的建议,请参考:[ASP.NET 状态管理的建议]。

能够存储在视图状态中的数据类型

你能够在视图状态中存储下列类型的对象:

  • 字符串

  • 整数

  • 布尔值

  • 数组对象

  • ArrayList 对象

  • 哈希表

  • 自定义的类型转换器(关于更多的信息,请参考:[TypeConverter 类])

当然你也能够存储其他类型的数据,但是被存储的类必须使用 Serializable 参数进行编译,这样视图状态才能够把它们序列化到 XML 中。

使用视图状态时的考虑

视图状态为特定的 ASP.NET 页面提供状态信息。如果你需要在多个页面中使用这些信息,或者如果你需要状态信息能够在所有网站请求之间被持续保持,那么你应该使用另外一种状态维护的方式(如应用程序状态、会话状态或者个性化)。

视图状态信息通过使用基于 64 位编码被序列化到 XML 中。从而可能产生大量的数据。在页面被回传到服务器的时候,视图状态的内容会作为页面回传信息的一部分被发送。如果视图状态包含大量的信息,就会影响到页面的性能。因此,建议你对应用程序中使用典型数据的页面进行测试,以检测视图状态的数量是否能够导致应用程序出现性能问题。作为使用视图状态的另一种选择,请参考:[ASP.NET 状态管理的建议]。

在有些环境中(如在每次回传过程中都从数据存储中被更新的数据驱动页面),你应该关闭视图状态来删除由数据控件(如 GridView 控件)所产生的庞大的隐藏字段。

提示:即使你已经明确地关闭了视图状态,一个指示页面是否被回传的隐藏字段仍然会被发送到浏览器。

另一个重要考虑就是隐藏字段中的庞大数据,有些代理和防火墙将会防止对包含这些数据的页面进行访问。因为数量的上限会随着不同的防火墙和代理实现而变化,所以庞大的隐藏字段能够引起零星的问题。为了避免出现这种情况,如果被存储在 ViewState 属性中的数据的数量超过了在页面的 MaxPageStateFieldLength 属性中所指定的上限,那么页面会把视图状态拆分到多个隐藏字段中以减少在防火墙所限制的尺寸下的每个单独字段的大小。

有些移动设备并不支持任何的隐藏字段。因此,视图状态将无法在这些设备中工作。关于更多信息和选择,请参考:[ASP.NET 移动设备应用程序开发概览]。

控件状态

除了视图状态之外,ASP.NET 还支持一个被称作控件状态的特征。页面使用控件状态对必须在回传过程之间被保持的控件状态进行持续保持,即使在页面或者控件的视图状态被禁用的情况下也是如此。与视图状态一样,控件状态也能够把状态信息存储到一个或多个隐藏字段中。关于更多信息,请参考:[ASP.NET 状态管理概览]。

你可能感兴趣的:(asp.net)