LYWILL设计运营 - 网站运营与推广、开发技术、成功项目展示。

ASP.NET 视图状态 导致页面发生异常

经常有用户反应页面出错,今天终于抓到原因了,原来是页面的ViewState太长了,POST回来的时候被截断了,所以ASP.NET会发生异常。

Web 应用程序是无状态的。每次从服务器请求页时,都会创建网页类的一个新实例。这通常意味着在每次往返过程中会丢失该页及其控件中的所有信息。例如,默认状态下,如果用户将信息输入到 HTML 网页上的文本框中,该信息会发送到服务器。但是,该信息不会在响应中返回到浏览器。

为了克服 Web 编程的这一固有的局限性,ASP.NET 页框架包含几种状态管理功能,可以在往返过程之间将页和控件值保存到 Web 服务器。其中一种功能便是视图状态

默认情况下,ASP.NET 页框架使用视图状态在往返过程之间保存页和控件值。在呈现页的 HTML 时,必须在回发过程中保留的页和值的当前状态将被序列化为 Base64 编码字符串。然后,它们将被放入页中的一个或多个隐藏字段。

您可以在代码中使用页的 ViewState 属性访问视图状态。ViewState 属性是一个包含键/值对(其中包含视图状态数据)的字典。

 

使用视图状态的注意事项

视图状态提供了特定 ASP.NET 页的状态信息。如果需要在多个页上使用信息,或者如果需要在对网站的多次访问之间保存信息,必须使用其他方法来维护状态。您可以使用应用程序状态、会话状态或配置文件属性。

视图状态信息被序列化为 XML,然后使用 base-64 编码机制进行编码,这可能会生成大量数据。将页发送到服务器时,视图状态的内容会作为页回发信息的一部分进行发送。如果视图状态包含大量信息,则会影响页的性能。请使用应用程序的典型数据测试页性能,以确定视图状态的大小是否会导致性能问题。

如果不必存储单个控件的控件信息,则可以禁用控件的视图状态。如果页上的某个控件在每次回发时从数据存储区进行刷新,则可以关闭该控件的视图状态以减少视图状态的大小。例如,可以关闭 GridView 控件的视图状态。

说明:

即使您显式关闭视图状态,也仍会将隐藏字段发送到浏览器,以指示该页正在回发信息。

另一个注意事项是,如果隐藏字段中的数据量过大,则某些代理和防火墙将禁止访问包含这些数据的页。由于最大允许数量可能随所实现的防火墙和代理的不同而不同,因此大的隐藏字段可能会导致间歇性问题。如果存储在 ViewState属性中的数据量超出了在页的 MaxPageStateFieldLength 属性中指定的值,则页会将视图状态拆分为多个隐藏字段。这可减小单个隐藏字段的大小,使其大小不会超过防火墙所允许的上限。

某些移动设备根本不允许使用隐藏字段。因此,视图状态对于这些设备无效。

参考:msdn.microsoft.com/zh-cn/library/75x4ha6s(v=VS.90).aspx