状态管理是您对同一页或不同页的多个请求维护状态和页信息的过程。与所有基于 HTTP 的技术一样,Web 窗体页是无状态的,这意味着它们不自动指示序列中的请求是否全部来自相同的客户端,或者单个浏览器实例是否一直在查看页或站点。此外,到服务器的每一往返过程都将销毁并重新创建页;因此,如果超出了单个页的生命周期,页信息将不存在。
ASP.NET 提供多种方式来在服务器往返过程之间维护状态。对这些状态管理选项的选择主要取决于您的应用程序,并且应基于以下条件:
需要存储的信息量有多大?
客户端是接受持久性的还是内存中的 Cookie?
要将信息存储在客户端还是服务器上?
信息是否是敏感信息?
您对应用程序设定了什么样的性能和带宽条件?
目标浏览器和设备具有什么样的功能?
您是否需要储存基于用户的信息?
信息需要存储多长时间?
您使用 Web 场(多个服务器)、Web 园(一个计算机上的多个进程)还是单个进程来运行应用程序?
客户端状态管理
视图状态
Web 窗体页提供 ViewState 属性作为内置结构,在对同一页的多个请求间自动保留值。视图状态作为页中的隐藏域来进行维护。
可以使用视图状态在页回发到自身时跨越往返过程存储您自己的页特定值。例如,如果您的应用程序正在维护用户特定的信息(即,该信息在页上使用,但不是任何控件所必需的部分),则可以使用视图状态存储该信息。
使用视图状态的优点
不需要任何服务器资源 视图状态包含在页代码内的结构中。
实现简单 视图状态无需使用任何自定义编程。默认情况下对控件启用状态数据的维护。
增强的安全功能 视图状态中的值经过哈希计算和压缩,并且针对 Unicode 实现进行编码,其安全性要高于使用隐藏域。
使用视图状态的缺点
性能注意事项 由于视图状态存储在页本身,因此如果存储较大的值,用户显示页和发送页时的速度可能会减慢。尤其是对移动设备,其带宽通常是有限的。
设备限制 移动设备可能没有足够的内存容量来存储大量的视图状态数据。
潜在的安全风险 视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希格式存储数据,但它可以被篡改。如果直接查看页输出源,可以看到隐藏域中的信息,这导致潜在的安全性问题。