Hidden、ViewState、ControlState 区别

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

保存一些临时数据,供当前页面的程序使用。

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

<asp:HiddenField ID="HiddenField1" runat="server" Value="编程快乐" />

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

Response.Write(HiddenField1.Value);

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

·      数据直接暴露给用户。

·      只能存储字符串数据。

2.使用ViewState
ASP.NET引入了ViewState(视图状态)的概念。从这个名字上我们大概可以体会出,ViewState主要是用来存放和视图有关的一些状态。比如,在用户注册时用户填写了一大堆数据,提交页面后系统返回了一个“用户名重复”的出错信息,此时先前用户在页面上填写的一些注册资料全部没有了。用户会是什么感觉呢?我想大多数用户会很恼火。ASP.NET通过ViewState自动保存控件的状态。你可能也发现了,文本框中的数据在页面提交后还是存在的。ViewState肯定是不能跨页面使用的,而且每个用户访问到的ViewState都是独立的。此外,ViewState也没有什么声明周期的概念.ViewState是用base64编码的,ASP.NET首先对ViewState中的数据进行序列化,然后再使用base64编码后存储在页面的隐藏域中。base64不是什么加密算法,只是一种编码算法,任何人都能对base64进行反编码。

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

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

为了进一步的安全,我们需要验证客户端发回的ViewState是否已经被修改了。

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

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

<%@ Page Language="C#"   …  EnableViewStateMac="true" ViewStateEncryptionMode="Always" %>

当然,如果你希望为所有页面的ViewState应用验证和加密,可以在Web.config的system.Web节点中添加:

<pages enableViewStateMac="true" viewStateEncryptionMode="Always"></pages>

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

标记[Serializable],那么在这里我们使用ViewState保存MyUser实例的代码就和使用Session差不多。

MyUser user = new MyUser();

user.sUserName = "小朱";

user.iAage = 24;

ViewState["CustomClass"] = user;

读取代码:

MyUser user = ViewState["CustomClass"] as MyUser;

Response.Write(user.ToString());

滥用ViewState的结果

如果我们在ViewState中保存一个拥有100条记录的DataSet,恐怕页面就很难打开了。而且这些数据还要在浏览器和服务器之间往返,占用的网络流量很客观。因此,笔者建议你在ViewState中保存尽量少的数据。如果实在需要在ViewStatge中放置大量数据建议使用maxPageState- FieldLength对ViewState启用分块传输。

<%@ Page Language="C#"   …  maxPageStateFieldLength="100"%>使用maxPageStateFieldLength控制每个ViewState不超过100字节对于一些不实现任何交互的控件可以设置控件的EnableViewState属性为false来让控件不使用ViewState,从而减少页面体积。

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

PageStatePersister.ControlState = "编程快乐";

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

总结
其实隐藏域、ViewState和ControlState的原理差不多,我们来总结一下。

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

·      存储的类型限制。可序列化类型(直接在隐藏域中保存内容需要自己序列化)。

·      状态使用的范围。当前页面(当前控件),对用户独立。

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

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

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

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

Hidden、ViewState、ControlState 区别,布布扣,bubuko.com

时间: 2024-10-20 16:59:05

Hidden、ViewState、ControlState 区别的相关文章

[BS-17] iOS开发-Alpha,Hidden和Opaque区别

iOS开发-Alpha,Hidden和Opaque区别 UIView控件都有Alpha,Hidden和Opaque这三个常见属性,UIView控件BackgroundColor是用RGBA表示的,故背景色也会有一个alpha(在Storyboard中调色板显示为opacity).这些属性使用时易混淆,尤其是Alpha和Opaque之间有的时候不是很好分别,稍微整理下: Alpha(不透明度) alpha是不透明度,属性为浮点类型的值,取值范围从0到1.0,表示从完全透明到完全不透明,其特性有当前

【微信小程序】 wx:if 与 hidden(隐藏元素)区别

wx:if 与 hidden 都可以控制微信小程序中元素的显示与否. 区别: wx:if 是遇 true 显示,hidden 是遇 false 显示. wx:if 在隐藏的时候不渲染,而 hidden 在隐藏时仍然渲染,只是不呈现. 所以如果频繁切换的话,用 wx:if 将会消耗更多资源,因为每次呈现的时候他都会渲染,每次隐藏的时候,他都会销毁. 如果切换并不频繁的话,用 wx:if 相对来说较好些,因为它会避免初始就一下渲染那么多. wxml: <view> <text>page

iOS开发-Alpha,Hidden与Opaque区别

UIView中的这三个属性用的比较多,尤其是Alpha和Opaque之间有的时候不是很好分别,稍微整理下: Alpha(不透明度) alpha是不透明度,属性为浮点类型的值,取值范围从0到1.0,表示从完全透明到完全不透明,其特性有当前UIView的alpha值会被其所有subview继承.alpha值会影响到UIView跟其所有subview,alpha具有动画效果.当alpha为0时,跟hidden为YES时效果一样,但是alpha主要用于实现隐藏的动画效果,在动画块中将hidden设置为Y

两种隐藏元素方式【display: none】和【visibility: hidden】的区别及由此引出的问题

此前看到一随笔(@任天缘 原文)讲了这个问题,并总结了: [display: none]:隐藏元素及元素内的所有内容,并且该元素的位置.宽高等其他属性值一并“消失”: [visibility: hidden]:隐藏元素及元素内的所有内容,但是该元素的位置.宽高等属性值仍然还在. 也有总结:(@Nicholas_F の 领域 原文) display:none ---不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失,通俗来说就是看不见也摸不到. visibility:hidden--- 使对

CSS样式display:none和visibility:hidden的区别

同样是隐藏,display:none与visibility:hidden有什么区别呢? 虽然display:none与visibility:hidden都能达到隐藏可见元素的作用(视觉上),但事实上,visibility:hidden却占据了空间,width.height等属性依然被加载出来,它就像个透明人,会依然占据空间. 因此,在html+css布局的时候,根据需要,如果元素需要被隐藏但又要保留位置,那么就用visibility:hidden,如果要让元素彻底隐藏且不占据空间位置,那么dis

ASP.NET ViewState详解

ASP.NET ViewState详解[转载] asp.net存储textboxserializationstring服务器 作者:Infinities Loop 概述 ViewState是一个被误解很深的动物了.我希望通过此文章来澄清人们对ViewState的一些错误认识.为了达到这个目的,我决定从头到尾详细的描述一下整个ViewState的工作机制,其中我会同时用一些例子说明我文章中的观点,结论.比如我会用静态控件(declared controls)和动态控件(dynamic contro

session 和 cookie 的区别与联系

1.创建一个新的Cookie Cookie cookie = new Cookie("username",name); 2.设置cookie在客户端上存活多久 cookie.setMaxAge(30*60); 3.把cookie发送到客户 response.addCookie(cookie); 4.从客户请求得到cookie(或多个cookie) Cookie[]    cookies=request.getCookies(); for(int i=0-;i<cookies.le

viewState详解

作者:Infinities Loop 概述 ViewState是一个被误解很深的动物了.我希望通过此文章来澄清人们对 ViewState的一些错误认识.为了达到这个目的,我决定从头到尾详细的描述一下整个ViewState的工作机制,其中我会同时用一些例子说明我文 章中的观点,结论.比如我会用静态控件(declared controls)和动态控件(dynamic controls)两个方面来说明同一个问题. 现在有关ViewState的文章可谓多如牛毛,你可能会说再写有关 ViewState的文

转 opacity() 和 rgba() 的区别?display 和 visibility 有什么不同?

一.背景介绍: 1.大家在写页面时,会用到各种元素,比如div, img等等.有时候一张页面会放好几张图片,图片如果显示效果都一样,看起来很单调,整个页面给人的感觉会很硬.那么,怎么能让页面的元素有一种多样化,甚至有一种朦胧美呢?于是,有了opacity和rgba()这两个属性.其中,opacity属性是css3新提的属性. 2.另外,在看一下display和visibility背景介绍,故名思意,display和visibility是与元素显示有关系的,这两个属性都可以控制元素的显示与隐藏.究