当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET ViewState 初探 (1)

ASP.NET
asp.net Execl的添加,更新操作实现代码
asp.net 生成曲线图实现代码
从外部的js文件中获取ASPX页面的控件ClientID
asp.net 因为数据库正在使用的解决方法
asp.net Repeater 自递增
asp.net 实现防迅雷等下载工具盗链
ASP.NET封装的SQL数据库访问类
asp.net 通过指定IP地址得到当前的网络上的主机的域名
aspx 服务器架设问题解决
ASP.NET Session使用详解
Asp.net 5种页面转向方法
ASP.NET 用户多次登录的解决方法
ASP.NET下母版页和内容页中的事件发生顺序整理
asp.net 程序性能优化的七个方面 (c#(或vb.net)程序改进)
从客户端检测到有潜在危险的Request.Form值的asp.net代码
asp.net CommunityServer中的wwwStatus
在应用程序级别之外使用注册为allowDefinition=''MachineToApplication''的节是错误的
.net开发人员常犯的错误分析小结
ASP.net Substitution 页面缓存而部分不缓存的实现方法
asp.net 生成静态时的过滤viewstate的实现方法

ASP.NET ViewState 初探 (1)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 116 ::
收藏到网摘: n/a

与刚接触ASP.NET页面的开发人员交谈时,他们通常向我提出的第一个问题就是:“那个ViewState到底是什么?”他们的语气中流露出的那种感觉,就象我来到一家异国情调的餐馆,侍者端上一道我从未见过的菜肴时的那种感觉-既疑惑不解,又充满好奇。但肯定有人认为它不错,否则就不会提供了。所以,我会先尝一尝,或许会喜欢上它,尽管它看上去的确很古怪!

对于ViewState也是如此,但是如果适应了它的风格,您会发现在许多情况下,您将乐于在自己的ASP.NET应用程序中使用ViewState,因为它可以帮助您使用更少的代码完成更多的工作。但是,有时也会对ViewState完全弃之不用。下面我们就这两种情况分别进行阐述,不过,让我们先回答什么是ViewState这个问题。

答案:ViewState用于维护页面的UI状态

Web是没有状态的,ASP.NET页面也没有状态,它们在到服务器的每个往返过程中被实例化、执行、呈现和处理。作为Web开发人员,您可以使用众所周知的技术(如以会话状态将状态存储在服务器上,或将页面回传到自身)来添加状态。下面我们以图1中的注册窗体为例进行论述。

 
图1:恢复回传的窗体值

从上图中可以看出,我为便餐选择了一个无效的值。此窗体与Web上的多数窗体一样友好,它在出现错误的字段旁边显示一条有用的错误消息和一个星号。而且,窗体中还显示了我在其他文本框和下拉列表中输入的所有有效值。这在某种程度上是可能的,因为HTML窗体元素会在HTTP标头中将其当前值从浏览器发送到服务器。您可以使用ASP.NET跟踪来查看回传的窗体值,如图2所示。

 
图2:HTTP窗体中回传的值(通过ASP.NET跟踪显示)

在ASP.NET之前,通过多次回传将值恢复到窗体字段中完全是页面开发人员的责任,他们将不得不从HTTP窗体中逐个拾取回传值,然后再将其推回字段中。幸运的是,现在ASP.NET可以自动完成这项任务,从而为开发人员免除了一项令人厌烦的工作,同时也无需再为窗体编写大量的代码。但这并不是ViewState。

ViewState(英文)是一种机制,ASP.NET使用这种机制来跟踪服务器控件状态值,否则这些值将不作为HTTP窗体的一部分而回传。例如,由Label控件显示的文本默认情况下就保存在ViewState中。作为开发人员,您可以绑定数据,或在首次加载该页面时仅对Label编程设置一次,在后续的回传中,该标签文本将自动从ViewState中重新填充。因此,除了可以减少繁琐的工作和代码外,ViewState通常还可以减少数据库的往返次数。

ViewState的工作原理

ViewState确实没有什么神秘之处,它是由ASP.NET页面框架管理的一个隐藏的窗体字段。当ASP.NET执行某个页面时,该页面上的ViewState值和所有控件将被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段的值属性(即<inputtype=hidden>)。由于隐藏窗体字段是发送到客户端的页面的一部分,所以ViewState值被临时存储在客户端的浏览器中。如果客户端选择将该页面回传给服务器,则ViewState字符串也将被回传。在上面的图2中可以看到ViewState窗体字段及其回传的值。

回传后,ASP.NET页面框架将解析ViewState字符串,并为该页面和各个控件填充ViewState属性。然后,控件再使用ViewState数据将自己重新恢复为以前的状态。

关于ViewState还有三个值得注意的小问题。

如果要使用ViewState,则在ASPX页面中必须有一个服务器端窗体标记(<formrunat=server>)。窗体字段是必需的,这样包含ViewState信息的隐藏字段才能回传给服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET页面框架才能添加隐藏的字段。

页面本身将20字节左右的信息保存在ViewState中,用于在回传时将PostBack数据和ViewState值分发给正确的控件。因此,即使该页面或应用程序禁用了ViewState,仍可以在ViewState中看到少量的剩余字节。

在页面不回传的情况下,可以通过省略服务器端的<form>标记来去除页面中的ViewState。

充分利用ViewState

ViewState为跨回传跟踪控件的状态提供了一条神奇的途径,因为它不使用服务器资源、不会超时,并且适用于任何浏览器。如果您要编写控件,那么肯定需要了解如何在控件中维护状态(英文)。

开发人员在编写页面时同样可以按照几乎相同的方式来利用ViewState,只是有时页面会包含不由控件存储的UI状态值。您可以跟踪ViewState中的值,使用的编程语法与会话和高速缓存的语法类似:

[VisualBasic]

[C#]


//保存在ViewState中
ViewState["SortOrder"]="DESC";

//从ViewState中读取
stringsortOrder=(string)ViewState["SortOrder"];