·申请链接
·会员中心
·用户注册
·用户登录
·收藏本站
·忘记密码
  您好!今天是 网站首页 | 教员库 | 学员库 | 学习方法 | 资料下载 | 在线留言 桃李红QQ群 37681285 开通,请大家踊跃加入!北京桃李红家教信息中心帮您请家教,帮您当家教,北京家教为您当家教请家教提供全面服务
 您现在的位置: 桃李红家教信息网 >> 学习方法 >> 编程学习 >> 正文
ASP.NET VIEWSTATE初探[1]

作者:佚名    文章来源:本站原创    点击数:    更新时间:2008-7-10    

一、 ViewState 的作用

    与刚接触 页面的开发人员交谈时,他们通常向我提出的第一个问题就是:“那个 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 值和所有控件将被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段的值属性(即 <input type=hidden>)。由于隐藏窗体字段是发送到客户端的页面的一部分,所以 ViewState 值被临时存储在客户端的浏览器中。如果客户端选择将该页面回传给服务器,则 ViewState 字符串也将被回传。在上面的图 2 中可以看到 ViewState 窗体字段及其回传的值。

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

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

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

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

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

 三、充分利用 ViewState

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

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

    四、选择会话状态还是 ViewState?

    在某些情况下,将状态值保存在 ViewState 中并不是最佳选择,最常用的替代方法就是会话状态,它通常更适用于:

    1)大量的数据。由于 ViewState 增加了发送到浏览器的页面的大小(HTML 有效负载),同时也增加了回传的窗体的大小,因此不适合存储大量数据。

    2)未在 UI 中显示的安全数据。尽管 ViewState 数据已被编码,并且可以选择对其进行加密,但始终不将数据发送到客户端才是最安全的。因此,会话是更安全的选择。(由于数据库需要额外的凭据进行验证,因此将数据存储在数据库中会更安全。可以添加 SSL 以获得更安全的链接。)但是,如果在 UI 中已经显示了该专用数据,那么您应该已经确认了链接的安全性。在这种情况下,将同样的值放入 ViewState 不会降低安全性。

    3)尚未序列化到 ViewState 中的对象,如 DataSet。ViewState 序列化程序只为一小部分常用的对象类型进行了优化,如下所示。其他可序列化的类型或许可以保留在 ViewState 中,但速度会变慢,并会生成一个非常大的 ViewState。

    五、使用 ViewState 获得最佳性能

    使用 ViewState 时,每个对象都必须先序列化到 ViewState 中,然后再通过回传进行反序列化,因此使用 ViewState 并非是没有代价的。但是,如果遵循某些简单的原则对 ViewState 的成本加以控制,则通常不会产生明显的性能影响。

    1)在不需要时禁用 ViewState。下面的“减少使用 ViewState”一节将详细介绍这一问题。

    2)使用优化过的 ViewState 序列化程序。上面列出的类型具有专门的序列化程序,这些程序运行速度很快,并已经过优化,可以生成很小的 ViewState。如果要序列化一个未在上面列出的类型,可以创建一个自定义 TypeConverter 来显著提高它的性能。

    3)尽量减少使用对象,如果可能,尽量减少放入 ViewState 中的对象的数目。例如,不要使用二维字符串数组(名称/值,其对象的数目与数组的长度一样多),而应使用两个字符串数组(只有两个对象)。但是,在将两个已知类型存储在 ViewState 中之前,在这两者之间转换不会获得任何性能提高,因为这样做实际上相当于付出了两次转换的代价。

    六、减少使用 ViewState

    默认情况下 ViewState 将被启用,并且是由每个控件(而非页面开发人员)来决定存储在 ViewState 中的内容。有时,这一信息对应用程序并没有什么用处。尽管也没什么害处,但却会明显增加发送到浏览器的页面的大小。因此如果不需要使用 ViewState,最好还是将它关闭,特别是当 ViewState 很大的时候。

    可以基于每个控件、每个页面或每个应用程序来关闭 ViewState。在以下情况中将不再需要 ViewState:

    页面:页面不回传给自身。

    控件:1)处理的不是控件的事件。 2)控件没有动态的或数据绑定的属性值(或对于每一个请求它们都设置在代码中)。

    DataGrid 控件是 ViewState 的一个重量级用户。默认情况下,在网格中显示的所有数据也都存储在 ViewState 中,当需要一个复杂的操作(如复杂的搜索)来获取数据时,这是非常有用的。但是,DataGrid 的这种行为有时也使得 ViewState 成为累赘。

七、禁用 ViewState

    通过将对象的 EnableViewState 属性设置为 False 禁用了 ViewState。可以针对单个控件、整个页面或整个应用程序禁用 ViewState,如下所示:

    每个控件(在标记上) <asp:datagrid EnableViewState="false" ?/>

    每个页面(在指令中) <%@ Page EnableViewState="False" ?%>

    每个应用程序(在 web.config 中) <Pages EnableViewState="false" ?/>

    八、使 ViewState 更安全

    由于 ViewState 没有被格式化为清晰的文本,某些人有时会认为它被加密了,其实并没有。相反,ViewState 只是进行了 Base64 编码,以确保值在往返过程中不会发生变化,而并不考虑应用程序使用的响应/请求编码。

    可以向应用程序中添加两种 ViewState 安全级别:

    1)防篡改

    2)加密

    需要注意的是,ViewState 安全性对于处理和呈现 ASP.NET 页面所需的时间有直接的影响。简单地说,安全性越高,速度越慢。因此如果不需要,请不要为 ViewState 添加安全性。

    九、防篡改

    尽管散列代码不能确保 ViewState 字段中实际数据的安全,但它能够显著降低有人通过 ViewState 骗过应用程序的可能性,即防止回传应用程序通常禁止用户输入的值。

    可以通过设置 EnableViewStateMAC 属性来指示 ASP.NET 向 ViewState 字段中追加一个散列代码:

    <%@Page EnableViewStateMAC=true %>

    可以在页面级别上设置 EnableViewStateMAC,也可以在应用程序级别上设置。在回传时,ASP.NET 将为 ViewState 数据生成一个散列代码,并将其与存储在回传值中的散列代码进行比较。如果两处的散列代码不匹配,该 ViewState 数据将被丢弃,同时控件将恢复为原来的设置。

    默认情况下,ASP.NET 使用 SHA1 算法来生成 ViewState 散列代码。此外,也可以通过在 machine.config 文件中设置 <machineKey> 来选择 MD5 算法,如下所示:

    <machineKey validation="MD5" />

    十、加密

    可以使用加密来保护 ViewState 字段中的实际数据值。首先,必须如上所述设置 EnableViewStatMAC="true"。然后,将     machineKey validation 类型设置为 3DES。这将指示 ASP.NET 使用 Triple DES 对称加密算法来加密 ViewState 值。

    <machineKey validation="3DES" />

    十一、

[1] [2] 下一页

文章录入:zql    责任编辑:zql 
 
  • 上一篇文章:

  • 下一篇文章: 没有了
  •  
     相关文章
     
    固顶文章桃李红家教网免费发布家教信息,免…
    固顶文章让孩子享用一生的6个好习惯
    普通文章对中国人有用的学习外语五大绝招
    普通文章四六级听不懂20分照样拿 教你如何…
    普通文章改掉做英语四六级阅读理解题的不…
    普通文章四级阅读:是读不懂读不快还是做…
    普通文章ASP.NET VIEWSTATE初探[1]
    普通文章学习asp.net比较完整的流程
    普通文章ASP.NET程序中常用的三十三种代码
    普通文章互联网DNS存在重大漏洞 黑客可能…
     热门文章
     
    ·桃李红家教网免费发布家教信息,免…
    ·让孩子享用一生的6个好习惯
    ·考状元谈英语学习方法
    ·暑假家长应做好的几件事
    ·八招让孩子倾吐心声
    ·如何与孩子沟通
    ·我学英语的“诀窍”
    ·高考,考的就是心理素质
    ·妙用“超级”学习法
    ·一本书 一页纸 一本书
     
      桃李红家教网欢迎您给我们提出意见--------------------评论数:200
    姓 名: *
    评论内容:
     
    Google
     名师推荐
    ·YW23 张老师 ★★★★
    本人是在职重点中学高中英语教师,辅导过不同年龄阶段…
    ·SX983 杨老师
    15年教龄 多年家教经历 经验丰富  善于和学生沟通  是…
    ·T015001 李教员 ★★★
    有责任心,思维敏捷,方法独特,能使学员快速掌握学习技巧…
     学习方法
    固顶文章[编程学习]桃李红家教网免费发布家教信息,免…
    固顶文章[教师谈学习方法]让孩子享用一生的6个好习惯
    普通文章[英语角]对中国人有用的学习外语五大绝招
    普通文章[英语角]四六级听不懂20分照样拿 教你如何…
    普通文章[英语角]改掉做英语四六级阅读理解题的不…
    普通文章[英语角]四级阅读:是读不懂读不快还是做…
    普通文章[编程学习]ASP.NET VIEWSTATE初探[1]
    普通文章[编程学习]学习asp.net比较完整的流程
    普通文章[编程学习]ASP.NET程序中常用的三十三种代码
    普通文章[编程学习]互联网DNS存在重大漏洞 黑客可能…
    设为首页 | 友情链接 | 版权申明 | 网站地图 | 联系我们 | ↑回到顶端

    Copyright © 2007 . All Right Reserved.桃李红家教信息中心版权所有
    联系电话:010-86109483 信息发布:13810190471 学员:13161085788 教员:13699215918
    京ICP备07018744号 | 桃李红家教网 QQ 756257761 QQ群:37681285