什么是 view state?

View State是客户端状态管理重要机制之一。当页面PostBack(向服务器发送或获得数据)时,它能存储页面的值。
ASP.NET把View State属性作为页面面内置的结构。当多个请求相同的页面时自动存储数据。

例子:

如果你向加一个变量到View State,

  1. ViewState["Var"]=Count;

从View State返回数据

  1. string Test=ViewState["TestVal"];

在返回数据时,经常我们需要对ViewState中的值进行类型转换

 

view state有那些好处?

* 易于实现
    * 不需要服务器资源
    * 可增强安全性 ,它能被压缩或编码。

view state有那些缺点?

* 如果保存比较大的数据,将增加性能开销。因为它和页面相关。
    * 如果它把数据以散列格式存放在隐藏域中,容易被捕获
    * 在移动设备中不被支持。

什么时候使用view state?

当你选择View State作为维护页面状态的机制时,应该记住下面几点:

* 数据应该比较小,因为数据和页面控件绑定。数据量大,导致性能开销多大。
    * 避免在view state存储安全要求高的数据。

什么时候避免使用view state?

在下列情况下,控件不需要view state:

* 控件从不改变
    * 控件每次PostBack重新构建
    * 控件时input类型,只有用户才能改变

view state存在那里?

View State把页面控件的值散列,编码为一个字符串。它仅包含页面和控件信息。它和服务器没有交互。它一直保存在客户端浏览器的页面里。ViewState使用隐藏域保存这些编码后的信息。
假想你写一段简单的代码,保存控件的值:

  1. ViewState["Value"] = MyControl.Text;

运行应用程序,在浏览器,右键 > 查看源文件。 你将得到下面代码块。

值看起来向被加密的字符串。这是Base64编码。这不是加密字符串,所以易于解码。

在view state怎么存储对象?

我们能容易的存储一个对象,就像存储字符串,和int类型的变量。但我们需要把它转为字节流,因为ViewState存储数据在页面隐藏域中。所以我们需要序列化。如果要存放在view state中的数据没有被序列化,将出现错误。

  1. [Serializable]
  2. public class student
  3. {
  4. public int Roll;
  5. public string Name;
  6. public void AddStudent(int intRoll,int strName)
  7. {
  8. this.Roll=intRoll;
  9. this.Name=strName;
  10. }
  11. }

把类student的对象存储在view state.

  1. //Store Student Class in View State
  2. student _objStudent = new student();
  3. _objStudent.AddStudent(2, "Abhijit");
  4. ViewState["StudentObject"] = _objStudent;
  5. //Retrieve Student information view state
  6. student _objStudent;
  7. _objStudent = (student)ViewState["StudentObject"];

怎么跟踪view state信息?

如果想跟踪view state信息, 通过Page指令的Trace属性为true。

  1. <%@ Page Language="C#" Trace="true"

运行web应用程序。你将在树状控件区看到控件ID,和ViewState大小等详细信息。不要担心"Render Size Byte" , 它是控件的大小。

启用或禁止View State

你可以启用或禁止单个控件View state,也可以启用或禁止页面级别的View State.设置控件EnableViewState属性false,可以关掉单个控件的View State.例如:

  1. TextBox1.EnableViewState =false;

通过Page指令的EnableViewState属性为false.关闭整个页面的View State.

  1. <%@ Page Language="C#"  EnableViewState="false"

即使禁止了整个页面的View State.你将看到在隐藏的view state标签中仍然保存少量信息。这是因为ASP.NET一直最少量的保存控件的层级关系信息。即使View State被关闭了。

为了启动View State,你需要把相应的数据设置为True.下面是一个启动单个控件View State的例子:

  1. TextBox1.EnableViewState =true;

启动页面级别ViewState的例子:

  1. <%@ Page Language="C#"  EnableViewState="true"

怎么保证View State的安全性?

我已经说了View State信息是以Base64字符串编码保存在隐藏域中。它看起来象:

许多ASP.NET程序员以为这是被加密的格式。我再说一次,这不是加密的字符串,它很容易被破解。为了确保View State的安全,可以进行两个设置:
    *      首先,你要确保View State信息使用"hash code"防干扰的。 可以通过Page指令 EnableViewStateMAC属性为true. MAC 代表"Message Authentication Code"

  1. <%@ Page Language="C#" EnableViewState="true" EnableViewStateMac="true"

hash code(保密性强的校验)由ASP.NET计算出。被附加到View State内容中保存于隐藏域。再下次PostBack时,那个校验码被验证。如果有错误,Post Back将被拒绝,我们也可以再web.config中设置该属性。

*      第二个设置是:通过Page指令ViewStateEncryptionMode属性为Always。这将加密View State数据。如下设置:

  1. <%@ Page Language="C#" EnableViewState="true" ViewStateEncryptionMode="Always"

ViewStateEncryptionMode 有三个可选项:

* Always
    * Auto
    * Never
Always意味着View State一直被加密。Never意味者从来不加密。Auto意味着对特别指定的控件加密,该控件必须调用Page.RegisterRequiresViewStateEncryption()方法请求加密。

也可以在web.config中设置 "EnableViewStateMAC" 和 ViewStateEncryptionMode"

  1. <system.web>
  2. <pages viewStateEncryptionMode ="Always"
  3. enableViewStateMac ="true"/>
  4. </system.web>

注意 : 避免不必要的加密。因为这导致性能问题。

一些重要点

问题 回答
客户端还是服务器端 客户端
是否使用服务器资源
是否易于实现
是否有性能问题 对于大数据,加密,解密会有
支持加密解密? 支持
能存储对象? 可以。但需要在类上加serialize关键字
会超时吗? 不会

什么是 view state?

View State是客户端状态管理重要机制之一。当页面PostBack(向服务器发送或获得数据)时,它能存储页面的值。
ASP.NET把View State属性作为页面面内置的结构。当多个请求相同的页面时自动存储数据。

例子:

如果你向加一个变量到View State,

  1. ViewState["Var"]=Count;

从View State返回数据

  1. string Test=ViewState["TestVal"];

在返回数据时,经常我们需要对ViewState中的值进行类型转换

view state有那些好处?

* 易于实现
    * 不需要服务器资源
    * 可增强安全性 ,它能被压缩或编码。

view state有那些缺点?

* 如果保存比较大的数据,将增加性能开销。因为它和页面相关。
    * 如果它把数据以散列格式存放在隐藏域中,容易被捕获
    * 在移动设备中不被支持。

什么时候使用view state?

当你选择View State作为维护页面状态的机制时,应该记住下面几点:

* 数据应该比较小,因为数据和页面控件绑定。数据量大,导致性能开销多大。
    * 避免在view state存储安全要求高的数据。

什么时候避免使用view state?

在下列情况下,控件不需要view state:

* 控件从不改变
    * 控件每次PostBack重新构建
    * 控件时input类型,只有用户才能改变

view state存在那里?

View State把页面控件的值散列,编码为一个字符串。它仅包含页面和控件信息。它和服务器没有交互。它一直保存在客户端浏览器的页面里。ViewState使用隐藏域保存这些编码后的信息。
假想你写一段简单的代码,保存控件的值:

  1. ViewState["Value"] = MyControl.Text;

运行应用程序,在浏览器,右键 > 查看源文件。 你将得到下面代码块。

值看起来向被加密的字符串。这是Base64编码。这不是加密字符串,所以易于解码。

在view state怎么存储对象?

我们能容易的存储一个对象,就像存储字符串,和int类型的变量。但我们需要把它转为字节流,因为ViewState存储数据在页面隐藏域中。所以我们需要序列化。如果要存放在view state中的数据没有被序列化,将出现错误。

  1. [Serializable]
  2. public class student
  3. {
  4. public int Roll;
  5. public string Name;
  6. public void AddStudent(int intRoll,int strName)
  7. {
  8. this.Roll=intRoll;
  9. this.Name=strName;
  10. }
  11. }

把类student的对象存储在view state.

  1. //Store Student Class in View State
  2. student _objStudent = new student();
  3. _objStudent.AddStudent(2, "Abhijit");
  4. ViewState["StudentObject"] = _objStudent;
  5. //Retrieve Student information view state
  6. student _objStudent;
  7. _objStudent = (student)ViewState["StudentObject"];

怎么跟踪view state信息?

如果想跟踪view state信息, 通过Page指令的Trace属性为true。

  1. <%@ Page Language="C#" Trace="true"

运行web应用程序。你将在树状控件区看到控件ID,和ViewState大小等详细信息。不要担心"Render Size Byte" , 它是控件的大小。

启用或禁止View State

你可以启用或禁止单个控件View state,也可以启用或禁止页面级别的View State.设置控件EnableViewState属性false,可以关掉单个控件的View State.例如:

  1. TextBox1.EnableViewState =false;

通过Page指令的EnableViewState属性为false.关闭整个页面的View State.

  1. <%@ Page Language="C#"  EnableViewState="false"

即使禁止了整个页面的View State.你将看到在隐藏的view state标签中仍然保存少量信息。这是因为ASP.NET一直最少量的保存控件的层级关系信息。即使View State被关闭了。

为了启动View State,你需要把相应的数据设置为True.下面是一个启动单个控件View State的例子:

  1. TextBox1.EnableViewState =true;

启动页面级别ViewState的例子:

  1. <%@ Page Language="C#"  EnableViewState="true"

怎么保证View State的安全性?

我已经说了View State信息是以Base64字符串编码保存在隐藏域中。它看起来象:

许多ASP.NET程序员以为这是被加密的格式。我再说一次,这不是加密的字符串,它很容易被破解。为了确保View State的安全,可以进行两个设置:
    *      首先,你要确保View State信息使用"hash code"防干扰的。 可以通过Page指令 EnableViewStateMAC属性为true. MAC 代表"Message Authentication Code"

  1. <%@ Page Language="C#" EnableViewState="true" EnableViewStateMac="true"

hash code(保密性强的校验)由ASP.NET计算出。被附加到View State内容中保存于隐藏域。再下次PostBack时,那个校验码被验证。如果有错误,Post Back将被拒绝,我们也可以再web.config中设置该属性。

转载:http://www.it118.org/specials/321869dd-98cb-431b-b6d2-82d973cd739d/86b6adb6-fd7e-48ed-975a-1c262c586202.htm

*      第二个设置是:通过Page指令ViewStateEncryptionMode属性为Always。这将加密View State数据。如下设置:

  1. <%@ Page Language="C#" EnableViewState="true" ViewStateEncryptionMode="Always"

ViewStateEncryptionMode 有三个可选项:

* Always
    * Auto
    * Never
Always意味着View State一直被加密。Never意味者从来不加密。Auto意味着对特别指定的控件加密,该控件必须调用Page.RegisterRequiresViewStateEncryption()方法请求加密。

也可以在web.config中设置 "EnableViewStateMAC" 和 ViewStateEncryptionMode"

  1. <system.web>
  2. <pages viewStateEncryptionMode ="Always"
  3. enableViewStateMac ="true"/>
  4. </system.web>

注意 : 避免不必要的加密。因为这导致性能问题。

一些重要点

问题 回答
客户端还是服务器端 客户端
是否使用服务器资源
是否易于实现
是否有性能问题 对于大数据,加密,解密会有
支持加密解密? 支持
能存储对象? 可以。但需要在类上加serialize关键字
会超时吗? 不会

ViewState探索的更多相关文章

  1. 【探索】机器指令翻译成 JavaScript

    前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...

  2. 【探索】利用 canvas 实现数据压缩

    前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...

  3. 探索C#之6.0语法糖剖析

    阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. Linux学习之探索文件系统

    Linux,一起学习进步-    ls With it, we can see directory contents and determine a variety of important file ...

  6. 马里奥AI实现方式探索 ——神经网络+增强学习

    [TOC] 马里奥AI实现方式探索 --神经网络+增强学习 儿时我们都曾有过一个经典游戏的体验,就是马里奥(顶蘑菇^v^),这次里约奥运会闭幕式,日本作为2020年东京奥运会的东道主,安倍最后也已经典 ...

  7. C++随笔:.NET CoreCLR之GC探索(4)

    今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔.下面我们继续: // Initialize fre ...

  8. C++随笔:.NET CoreCLR之GC探索(2)

    首先谢谢 @dudu 和 @张善友 这2位大神能订阅我,本来在写这个系列以前,我一直对写一些核心而且底层的知识持怀疑态度,我为什么持怀疑态度呢?因为一般写高层语言的人99%都不会碰底层,其实说句实话, ...

  9. 【腾讯优测干货分享】安卓专项测试之GPU测试探索

    本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63 作者:章未哲——腾讯SNG质 ...

随机推荐

  1. EclipsePHP Studio 常用设置笔记

    工作需要,学习PHP使用EclipsePHP Studio开发工具, 习惯整理下常用的使用设置,分享一下吧: 1.窗口-首选项-常规-工作空间,把文本文件编码改为utf8,以后再新建文件就默认是utf ...

  2. Python学习笔记:02数据类型

    Python 数据类型 python中标准的数据类型有 基础类型 整型(长整型) 浮点型 复数型 布尔型 序列类型 字符串 列表 元组 字典 整型 整型和长整型并不严格区分,整型int的表达范围和计算 ...

  3. Day2 数据类型

    1.数字:int(整型) 32位机器:-2**31~2**31-1 64位机器:-2**63~2**63-1 float(浮点型) 2.布尔值 真或假 1或0 bool(0) 3.字符串 name = ...

  4. C语言笔记(结构体与offsetof、container_of之前的关系)

    关于结构体学习,需要了解:结构体的定义和使用.内存对齐.结构体指针.得到结构体元素的偏移量(offsetof宏实现) 一.复习结构体的基本定义和使用 typedef struct mystruct { ...

  5. select查询的性能

    为什么忘记commit也会造成select查询的性能问题 今天遇到一个很有意思的问题,一个开发人员反馈在测试服务器ORACLE数据库执行的一条简单SQL语句非常缓慢,他写的一个SQL没有返回任何数据, ...

  6. 关于32位程序在Win7&64位系统中连接Microsoft Excel数据源的问题

    最近在新公司电脑上跑以前的selenium测试框架的时候,抛出了如下的错误 出现的是ODBC Driver问题:[Microsoft][ODBC Driver Manager] Data source ...

  7. STM32f103------ADC(DMA)

    STM32F10x  ADC 技术指标: 分辨率: 12位分辨率  LSB=Vref+  / 2^(12) 转换时间: 采样一次至少14个ADC时钟周期 ,而ADC最高时钟周期为14MHz  选用采样 ...

  8. 自定义xamarin.forms Entry 背景色以及边框

    创建   一个Xamarin.Forms自定义控件.     自定义Entry控件可以通过继承来创建Entry控制,显示在下面的代码示例: public class MyEntry : Entry { ...

  9. BZOJ 1028 [JSOI2007]麻将

    1028: [JSOI2007]麻将 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1270  Solved: 576[Submit][Status][ ...

  10. COJ 0017 20604悲剧文本

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=17 20604悲剧文本 难度级别:B: 运行时间限制:1000ms: 运行空 ...