C# ViewState

C# ViewStateViewState用于维护页面的UI状态,Web是没有状态的,ASP.NET页面也没有状态,它们在到服务器的每个往返过程中被实例化、执行、呈现和处理。作为Web开发人员,您可以使用众所周知的技术(如以会话状态将状态存储在服务器上,或将页面回传到自身)来添加状态。一、ViewState的原理浏览器请求Default.aspx页面在服务器端发现创建的ViewState这个时候会自动创建一…

大家好,又见面了,我是你们的朋友全栈君。

ViewState用于维护页面的UI状态,Web是没有状态的,ASP.NET页面也没有状态,它们在到服务器的每个往返过程中被实例化、执行、呈现和处理。作为Web开发人员,您可以使用众所周知的技术(如以会话状态将状态存储在服务器上,或将页面回传到自身)来添加状态。

一、ViewState的原理

  1. 浏览器请求Default.aspx页面
  2. 在服务器端 发现创建的ViewState 这个时候 会自动创建一个名字叫做__VIEWSTATE(双下滑线 全部是大写)的隐藏域;其隐藏域的值经过base64加密以后返回到浏览器端这一加密过程在页面生命周期的SaveState事件中的SaveAllState方法中完成
  3. 当浏览器提交表单的时候 将__VIEWSTATE的隐藏域也一起提交到服务端 这个时候页面生命周期的ReadState事件的ReadAllState方法会将加密后的值反base64解密。最后将值赋值给名字叫做name的ViewState
  4. 最后来操作ViewState中的值

二、ViewState的用法

  1. 定义ViewState属性
public int PageCount{
get{return (int)ViewState["PageCount"];}
set{ViewState["PageCount"]=value;}
}
  1. 使用ViewState的条件
    如果要使用ViewState,则在ASPX页面中必须要有一个服务器端窗体标记(<form runat = "server">)。窗体字段是必须的,这样包含ViewState信息的隐藏字段才能被传回服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.net页面框架才能添加隐藏字段。
    page的EnableViewState 属性值为true
    控件的EnableViewState 属性值为 true
  2. ViewState需要注意的地方
    a. 当存在页面回传时,不需要维持控件的值就要把 ViewState 禁止。
    b. ViewState的索引是大小写敏感的。
    c. ViewState不是跨页面的。
    d. 为了能保存在 ViewState中,对象必须是可流化或者定义了 TypeConverter。
    e. 控件 TextBox 的 TextMode 属性设置为 Password时,它的状态将不会被保存在 ViewState 中,这应该是出于安全性的考虑。
    f. 在页面没有回传或重定向或在回传中转到(transfer)其他页面时不要使用 ViewState。
    g. 在动态建立控件时要小心它的 ViewState。
    h. 当禁止一个程序的 ViewState 时,这个程序的所有页面的 ViewState 也被禁止了。
    i. 只有当页面回传自身时ViewState 才是持续的。
  3. 设置ViewState
    ViewState可以在控件,页,程序,全局配置中设置。缺省情况下 EnableViewState 为 true 。如果要禁止所有页面 ViewState 功能,可以在程序配置中把 EnableViewState 设为 false

三、安全性
    其实,对于viewstate的安全性问题,asp.net还给我们提供了更多的选择。一般如果要保护viewstate有两种方式:一种是防篡改,一种是加密; 一说到防篡改,我们就想起了使用散列代码.。没错, 我们可以在页面顶部加入如下代码:Page EnableViewStateMAC=true。这样asp.net就会自动的在viewstate中追加一个散列码,在页面回传时,服务器根据回传的viewstate生成一个散列码,再与回传的散列码相比较,如果不对,则丢弃该viewstate,同时控件将恢复初试状态。 (默认情况下asp.net是通过SHA1算法而不是md5算法来生成散列,不过这个可以在machine.config里面配置machineKey validation=”MD5″即可),而viewstate加密就更简单了,只要在machine.config里设置一下machineKey validation=”3DES”即可实现用des加密viewstate了。

四、Session,ViewState用法对比

  1. 基本理论:
    session值是保存在服务器内存上,那么,可以肯定,大量的使用session将导致服务器负担加重. 而viewstate由于只是将数据存入到页面隐藏控件里,不再占用服务器资源,因此, 我们可以将一些需要服务器”记住”的变量和对象保存到viewstate里面. 而sesson则只应该应用在需要跨页面且与每个访问用户相关的变量和对象存储上. 另外,session在默认情况下20分钟就过期,而viewstate则永远不会过期.
  2. 数据类型:
    但viewstate并不是能存储所有的.net类型数据,它仅仅支持String、Integer、Boolean、Array、ArrayList、Hashtable 以及自定义的一些类型.
  3. 其他考虑:
    当然,任何事物都有两面性, 使用viewstate会增加页面html的输出量,占用更都的带宽,这一点是需要我们慎重考虑的. 另外, 由于所有的viewstate都是存储在一个隐藏域里面,用户可以很容易的通过查看源码来看到这个经过base64编码的值.然后再经过转换就可以获取你存储其中的对象和变量值.
    其实,对于viewstate的安全性问题,asp.net还给我们提供了更多的选择.一般如果要保护viewstate有两种方式: 一种是防篡改,一种是加密. 一说到防篡改,我们就想起了使用散列代码. 没错, 我们可以在页面顶部加入如下代码:Page EnableViewStateMAC=true。这样asp.net就会自动的在viewstate中追加一个散列码,在页面回传时,服务器根据回传的viewstate生成一个散列码,再与回传的散列码相比较,如果不对,则丢弃该viewstate,同时控件将恢复初试状态. (默认情况下asp.net是通过SHA1算法而不是md5算法来生成散列,不过这个可以在machine.config里面配置machineKey validation=”MD5″即可),而viewstate加密就更简单了, 只要在machine.config里设置一下machineKey validation=”3DES”即可实现用des加密viewstate了.

五、常用域对比

  • ViewState:ASP.NET 的 .aspx页面特有,页面级的;
    就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式;服务器端控件的值都自动保存在ViewState中;

  • Cookie:HTTP协议下的一种方式,通过该方式,服务器或脚本能够在客户机上维护状态信息;
    就是在客户端保存客户端单独使用的数据的一种方式;就像你的病历本一样,医院直接给你带回家;

  • Session:和.Net提供的辅助进程相关。
    在服务器端保存客户端单独使用的数据的一种方式;就像银行账户,钱都存在银行里,你就拿一张银行卡【所谓的SessionId】回家(写入客户端的Cookie中);

  • Application:在服务器端保存共享数据的一种方式;
    就像银行的单人公共卫生间,谁进去都行,但一次去一个,进去了就锁上门,出来再把锁打开;
    在这里插入图片描述
    本文转载自多篇文章,在此感谢。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162415.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 百度云BAE3.0 的ssh构造(本机ssh项目迁移到BAE3.0)

    百度云BAE3.0 的ssh构造(本机ssh项目迁移到BAE3.0)

    2022年1月11日
    47
  • SpringMVC 执行流程

    SpringMVC 执行流程springMVC(javaweb开发框架)1、MVC三层架构:模型(service、dao)、视图(JSP等)、控制器(Controller)什么是mvc?*MVC是模型、视图、控制器的简写,是一种软件设计规范*是将业务逻辑、数据、显示分离的方法来组织代码*MVC主要的作用就是降低了控制器(Controller)和视图(View)之间的双向耦合度*MVC不是一种设计模式、MVC是一种架构模式。当然不同的MVC存在着差异Model(数据模型):提供要展示的数据。因此包含数据和

    2022年6月28日
    25
  • Linux中top命令参数详解

    Linux中top命令参数详解top命令用法top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。top的使用方式top[-dnumber]|top[-bnp]参数解释:-d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。-b:以批次的方式执行top。-n:与-b配合使用,表示需要进行几次top命令的输出结果。-…

    2022年5月28日
    32
  • java环境搭建[通俗易懂]

    java环境搭建[通俗易懂]java环境搭建环境搭建(JDK与eclipse下载安装)目标:掌握Java环境搭建java环境搭建环境搭建(JDK与eclipse下载安装)目标:掌握Java环境搭建一、JDK下载和安装二、eclipse下载和安装三、eclipse常用配置设置四、编写代码一、JDK下载和安装下载:访问官网跳转到官网下载页面选择对应版本点击下载安装:打开安装包,依次点击下一步按其流程安装即可。配置环境变量(1)此电脑右击属性–>找到高级系统设置–>找到

    2022年7月9日
    22
  • python分类模型_nlp模型评估指标

    python分类模型_nlp模型评估指标不知道你是否已经看完了我之前讲过的有关机器学习的文章,如果没看过也没关系,因为本篇文章介绍的内容适用于所有分类模型(包括神经网络),主要就是介绍分类模型的评估指标。另外,在前面我还会提一下数据不平衡的问题该如何处理。总之本篇文章实用性极强!…

    2022年10月6日
    4
  • (详解)IDEA中使用git教程

    (详解)IDEA中使用git教程前言最近学习了一下VCS(VersionControlSystem),这里我选择的是Git而不是SVN,因为Git在本地磁盘上就保留着所有当前项目的历史更新,所以处理起来速度飞快,这是使用空间换时间的处理方式。使用Git,即使在没有网络或VPN的情况下,你同样可以非常愉快的频繁提交更新到本地仓库,等到有了网络的时候再提交到远程的仓库(百度百科)。1.IDEA安装GitIDEA虽然集成…

    2022年6月28日
    81

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号