热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【C#.NET】ASP.NET状态管理之五:隐藏域、ViewState、ControlState

一、使用隐藏域Session、Application和Cache都是保存在服务器内存中的。一般来说我们是无权访问客户端的机器,把数据直接保存在客户端的(

一、使用隐藏域

SessionApplicationCache都是保存在服务器内存中的。一般来说我们是无权访问客户端的机器,把数据直接保存在客户端的(COOKIE是一个例外,不过COOKIE只能保存不超过4K的字符串)。我们可以想一下还有哪里可以让我们暂时保存数据的?那就是页面!如果我们在Web页面中放置一个Label控件,然后设置它隐藏。那么我们就可以使用这个Label来保存一些临时数据,供当前页面的程序使用。

ASP.NET中,我们还可以使用隐藏域来进行类似的工作,和Label不同的是,在隐藏域中填写的内容不会直接显示在IDE的设计视图中。由于我们保存的这些数据根本不需要显示给用户看,所以用隐藏域更合理一些。

编程快乐" />

在代码中可以直接访问隐藏域的Value属性获得其值。

Response.Write(HiddenField1.Value);

不过,这样做还有几个不合理的地方。

·      数据直接暴露给用户。

·      只能存储字符串数据。

二、使用ViewState

ASP.NET引入了ViewState(视图状态)的概念。从这个名字上我们大概可以体会出,ViewState主要是用来存放和视图有关的一些状态。比如,在用户注册时用户填写了一大堆数据,提交页面后系统返回了一个“用户名重复”的出错信息,此时先前用户在页面上填写的一些注册资料全部没有了。用户会是什么感觉呢?我想大多数用户会很恼火。ASP.NET通过ViewState自动保存控件的状态。你可能也发现了,文本框中的数据在页面提交后还是存在的。

同时,我们也可以利用ViewState来保存一些程序需要的数据。ViewState中的数据默认是使用base64进行编码的,因此,用户不能直接看到里面的数据。我们在代码中可以这样添加一个ViewState项:

ViewState["test"] = "编程快乐";

打开页面,观察源代码,ViewState就在这里:

CMUgAMjbpmAwtMtwPE+b5Ii8uRFaO42AgKyR+u9T0Be" />

既然ViewState是存在页面上的,那么ViewState肯定是不能跨页面使用的,而且每个用户访问到的ViewState都是独立的。此外,ViewState也没有什么声明周期的概念,页面在ViewState就在,页面关闭了ViewState就关闭了。

观察上面的ViewState,是不是找不到“编程快乐”这几个字的影子呢?请在页面上随便加入一个按钮,按钮的Click事件处理方法如下:

Response.Write(System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(

Request["__VIEWSTATE"])));

如图5-1所示,单击按钮后页面显示如下。


5-1  ViewState数据进行base64解码

我们对ViewState数据进行base64解码后就能看到“编程快乐”的字样了。不过,现在的那串字符串还是很乱。其实,ASP.NET首先对ViewState中的数据进行序列化,然后再使用base64编码后存储在页面的隐藏域中。base64不是什么加密算法,只是一种编码算法,任何人都能对base64进行反     编码。

三、ViewState的安全与性能

如果我们需要在ViewState中保存一些相对比较机密的数据(当然,非常机密的数据不建议你保存在ViewState),又如何保证ViewState的安全性呢?一般来说可以从两个方面入手

1.保证客户端提交过来的ViewState没有被修改。我们做Web应用程序,心中要有这样一个意识,那就是客户端的一切都是不可相信的。大家可能以为只有我们提供了诸如TextBox等控件,用户才能修改。其实这种观点是错误的,虽然DropDownList中的内容只允许选择不允许修改,但完全可以伪造一个页面进行提交。对于ViewState也是同样道理,为了进一步的安全,我们需要验证客户端发回的ViewState是否已经被修改了。

2.保证用户不能直接看到ViewState中的数据。说白了就是对ViewState进行加密。

ASP.NET 2.0中,我们只需要进行简单地配置就能对ViewState进行验证和加密,在页面头部添加EnableViewStateMac(验证)和ViewStateEncryptionMode(加密)属性:

<%&#64; Page Language&#61;"C#"   … EnableViewStateMac&#61;"true" ViewStateEncryptionMode&#61;"Always" %>

当然&#xff0c;如果你希望为所有页面的ViewState应用验证和加密&#xff0c;可以在Web.configsystem.Web节点中添加&#xff1a;

既然ViewState中的数据是序列化后加入的&#xff0c;那么我们就可以把一些复杂的类型也存放到ViewState中。在介绍Session的时候我们曾建立过一个MyUser自定义类&#xff0c;并把它的实例存放到了Session中&#xff0c;后来为了让StateServerSqlServer模式的Session也能保存MyUser类型&#xff0c;我们又为MyUser标记了[Serializable]。在ViewState中保存自定义类型同样需要为类型标记[Serializable]&#xff0c;那么在这里我们使用ViewState保存MyUser实例的代码就和使用Session差不多。

MyUser user &#61; new MyUser();

user.sUserName &#61; "小朱";

user.iAage &#61; 24;

ViewState["CustomClass"] &#61; user;

读取代码&#xff1a;

MyUser user &#61; ViewState["CustomClass"] as MyUser;

Response.Write(user.ToString());

那么&#xff0c;ViewState中能保存多少数据呢&#xff1f;暂且不说表单Post的数据是有大小上限的&#xff0c;ViewState是经过序列化和编码后保存在页面中的。如果我们在ViewState中保存一个拥有100条记录的DataSet&#xff0c;恐怕页面就很难打开了。不信&#xff0c;你可以自己做一个试验。

DataSet ds &#61; new DataSet();

using (SqlConnection conn &#61; new SqlConnection(&#64;"server&#61;(local)"SQLEXPRESS;database&#61;

Forum;Trusted_Connection&#61;True"))

{

    SqlDataAdapter da &#61; new SqlDataAdapter("select top 100 * from CacheTest", conn);

    da.Fill(ds);

}

ViewState["Data"] &#61; ds;

仅仅只有100条记录&#xff0c;在ViewState就成这样了&#xff0c;如图5-2所示。

5-2  滥用ViewState的结果

而且这些数据还要在浏览器和服务器之间往返&#xff0c;占用的网络流量很客观。因此&#xff0c;笔者建议你在ViewState中保存尽量少的数据。如果实在需要在ViewStatge中放置大量数据建议使用maxPageState- FieldLengthViewState启用分块传输。

<%&#64; Page Language&#61;"C#"   … maxPageStateFieldLength&#61;"100"%>

如图5-3所示就设置了单个ViewState&#xff0c;不超过100字节&#xff0c;ViewState分成了几个部分。

5-3  使用maxPageStateFieldLength控制每个ViewState不超过100字节

我们知道&#xff0c;ViewState不仅仅是我们在使用&#xff0c;ASP.NET会把控件交互相关的一些数据都存放到ViewState中&#xff0c;但是对于一些不实现任何交互的控件&#xff08;比如显示10条记录的GridView&#xff09;&#xff0c;你可以设置控件的EnableViewState属性为false来让控件不使用ViewState&#xff0c;从而减少页面体积。

四、  ControlState概述

最后&#xff0c;我们再简单提一下&#xff0c;ASP.NET 2.0提供了ControlState。它用于保存&#xff08;自定义&#xff09;控件的关键信息。就算页面或者控件的ViewState被关闭它还能起作用&#xff0c;弥补了ViewState能被禁止的不足。不过使用ControlState稍显复杂&#xff0c;我们需要自己序列化复杂对象进行存储。下面的代码演示了如何在ControlState中保存和读取简单字符串&#xff1a;

PageStatePersister.ControlState &#61; "编程快乐";

Response.Write(PageStatePersister.ControlState.ToString());

五、总结

其实隐藏域、ViewStateControlState的原理差不多&#xff0c;我们来总结一下。

·      存储的物理位置。表单隐藏域。

·      存储的类型限制。可序列化类型&#xff08;直接在隐藏域中保存内容需要自己序列化&#xff09;。

·      状态使用的范围。当前页面&#xff08;当前控件&#xff09;&#xff0c;对用户独立。

·      存储的大小限制。存储过大数据会导致页面不能正常打开&#xff0c;不能正常提交。

·      生命周期。页面在就在&#xff0c;页面不在也就不在了。三者始终是依附在页面的隐藏域中的。

·      安全与性能。在客户端存储&#xff0c;安全性低。不过&#xff0c;ViewState提供了验证和加密。

·      优缺点与注意事项。存储少量数据非常方便简单。但需要注意不要存储敏感数据&#xff0c;不要存储过大的数据。它们和前面说的COOKIESessionApplication不同。虽然COOKIE也是存储在客户端&#xff0c;每次提交都附加在HTTP头中进行提交&#xff0c;但是它的数据量毕竟不大&#xff0c;起了一个标记的作用。SessionApplication都是存储在服务器端的&#xff0c;不会参与页面往返过程。隐藏域、ViewStateControlState始终参与往返&#xff0c;而且序列化和反序列化会消耗一定资源&#xff0c;因此&#xff0c;存储过大的数据会导致网页加载过慢&#xff0c;浪费服务器带宽。

转:https://www.cnblogs.com/cuishao1985/archive/2009/09/24/1573353.html



推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
author-avatar
李冰或李冰圆_862
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有