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

ASP.NET
ASP.NET开发:简化应用程序的开发支持Web标准
asp.net XMLHttpRequest实现用户注册前的验证
asp.net 页面间传值方法小结
asp.net url重写浅谈
asp.net 验证码生成和刷新及验证
C#精髓 GridView72大绝技 学习gridview的朋友必看
实例说明asp.net中的简单角色权限控制
asp.net网站开发包wq.dll打包下载
js与ASP.NET 中文乱码问题
asp.net checkbox 动态绑定id GridView删除提示
asp.net TextBox回车触发事件 图片在img显示
asp.net 脏字典过滤问题 用正则表达式来过滤脏数据
asp.NET 脏字过滤算法
asp.NET 脏字过滤算法 修改版
asp.net sql 数据库处理函数命令
asp.net Javascript 的几种写法与提示
ASP.NET MVC学习笔记
asp.net 中国身份证号码验证代码 非正则
Asp.net中使用Sqlite数据库的方法
asp.net 中文字符串提交乱码的解决方法

ASP.NET ViewState 初探 (1)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 115 ::
收藏到网摘: 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"];