这个配置节甚是简单,在MSDN中的介绍也甚是简单:为 ASP.NET 应用程序配置页的视图状态设置。

historySize的作用是设置要存储在页历史记录中的项数。

但是这根本是看不明白他是干嘛的,百度上一大串都是单纯说说配置节的意思,根本没再进一步阐述他的作用,我就不信其他人都懂了。还好有谷歌。看了一些老外的阐述,很多看不懂,还好有一篇好像懂它是个啥意思,就以那篇作为切入点。这个配置节是跟ViewState有关系的。

默认情况下ViewState是保存在页面中的,在ASP.NET可以使用SessionPageStetePersister类来把ViewState保存到Session里面。这样有利于保护ViewState同时也可以减少页面的大小。PageStatePersister是一个抽象类,他有两个子类:

HiddenFieldPageStatePersister:用一个隐藏域来记录PageState,默认是使用这个子类

SessionPageStatePersister:使用一个Session里面的变量来记录PageStete。

所以正常情况下对sessionPageState配置是看不出任何效果的,必须通过自定义一个PageAdapter,重写GetStatePersister()方法让其返回一个SessionPageStatePersister。

或者单纯在页面的隐藏代码里面重写PageStatePersister属性

那下面通过一个试验来证明这个historySize的作用,默认值是

但是这个值太大了,我把它设得小一点

然后在Page_Load方法中添加以下代码

大概解释一下就是页面第一次加载的时候会把lb1标签的背景颜色设置成红色,后面的代码是阅读了SessionPageStatePersister源码后发现的,现在是把Session的ViewState的键值取出来。下面的几幅截图查看运行 的效果:

第一次请求Session里面没有存放ViewState

在第一个文本框输入一个1之后点击button提交,响应的页面如下,Session里面存放了一个ViewState,并特别关注一下第一个key,__SESSIONVIEWSTATE8d41061dff4faae

如此类推在后面的文本框输入2,3,4

此时发现就算再提交多少次,Session里面存的ViewState也只是3个,这就是我们改配置historySize所达到的效果,就是官网上所说的存储在页历史记录中的项数。那接下来点击浏览器的回退按钮3次,由于浏览器的缓存可以看到页面貌似回复到之前状态,第二次提交时,Session里面只存了一个ViewSate,当时在文本框输入了2。

但是服务端上面的Seesion中已经丢弃页面中__SESSIONVIEWSTATE8d41061dff4faae对应的ViewState。猜想一下此时再点击button提交后会有什么效果

红色背景消失了。那下面就解答一下这个现象的原因。红色背景是只因为非PostBack的时候给lb1设置的属性,后面再多次提交时仍然保留是因为ViewState的作用保留了这个红色背景的设置。正常情况下无论发多少次PostBack请求(或者是提交)这个状态仍然会保留,但是点击了浏览器的回退按钮时就不一样了。它回退次数超过historySize时,再提交就会使得页面中的某些视图的状态与理想中的不一致,其原因是当前页面提交时会包含当前页面ViewState的一个key到服务器,通过这个key可以在Session里面把ViewState找出来,但是万一Session里面已经不包含提供的key对应的ViewState时,一些之前对视图设置的记录则会丢失,如上面把lb1的背景色设成红色。这个应用场景是怎么样现在也想不出来,像这种后退再提交的操作也一般不怎么会出现吧。如果遇到相关的问题时,希望是知道由于这个原因引起的。

另外补充记录一下ViewState在Session中的存储结构
在Session中有个固定键“__VIEWSTATEQUEUE”存储的队列,该队列里面存着一系列以"__SESSIONVIEWSTATE"作为前缀的字符串,这些字符串就是各个ViewState存在Session的键。通过这些字符串从Session中取出的值就是对应的ViewState了。

参考文章

Persisting Page State in ASP.NET 2.0

http://www.4guysfromrolla.com/articles/011707-1.aspx

How to remove ViewState from ASP.NET web page and save in Session using SessionPageStatePersister

http://dailydotnettips.com/2011/04/28/how-to-remove-viewstate-from-asp-net-web-page-and-save-in-session-using-sessionpagestatepersister/

sessionPageState与视图状态存储的更多相关文章

  1. Atitit 视图状态ViewState)的原理与管理

    Atitit  视图状态ViewState)的原理与管理   1.1. 视图状态ViewState的实现隐藏字段和url参数1 1.2. Asp.net的视图状态管理1 2. 1 2.1. H5的视图 ...

  2. ASP.NET - 视图状态概述

    本文转载自dodream 视图状态是 ASP.NET 页框架用于在往返过程之间保留页和控件值的方法.在呈现页的 HTML 标记时,必须在回发过程中保留的页和值的当前状态将被序列化为Base64 编码字 ...

  3. C# 问题解决思路--《数组bytes未定义》,ASP.NET页面加载顺序

    好久没写博客了,废话不多说,直接说问题. 问题发生情况,首先这个是老项目,然后我是第一次修改.当我解决了各种引用,数据库配置之后等类似的问题,我启动的项目的时候,无任何问题,但是当我点击页面的按钮的时 ...

  4. ASP.NET状态管理策略

    如果要想把信息存储在客户端那可以选择视图状态.控件状态.隐藏字段.cookie.和查询字符串. 1.web窗体页提供viewstate属性作为内置结构,在同一页的多个请求间自动保留值.他作为页面的隐藏 ...

  5. ASP.NET中的状态保持(转载)

    状态是某一类型的数据在一定时期内保持活跃的信息.这里说的一定时期可以使整个应用程序的生命周期,可以使用户操作程序的时间,当然也可以是单个页面的生命周期等.  为了解决传统Web编程中固有的限制,ASP ...

  6. 关于asp.net中页面事件加载的先后顺序

    一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件 ...

  7. Asp.net2.0里的SessionPageStatePersister

    备注: ASP.NET 页可在处理和提供任何网页所必需的原本无状态 HTTP 请求与响应之间存储 Page 状态信息.此状态称为“视图状态”. ASP.NET 的默认持久性机制是使用 HiddenFi ...

  8. 页面事件(Init,Load,PreRender)执行顺序

    简介 对由 Microsoft® Internet 信息服务 (IIS) 处理的 Microsoft® ASP.NET 页面的每个请求都会被移交到 ASP.NET HTTP 管道.HTTP 管道由一系 ...

  9. .NET Application,Session,Cookie,ViewState,Cache对象用法

    作用域 保存地址 生命周期Application 应用程序 服务器内存 IIS启动Session 整个站点 服务器内存 Session到时 默认20分钟Cashe 应用程序 服务器内存 应用程序的周期 ...

随机推荐

  1. 梦想还需有,因它必实现——发现最新版iOS漏洞,OverSky团队专访

    梦想还需有,因它必实现——发现最新版iOS漏洞,OverSky团队专访    “成功了!”,随着一句欢呼声在阿里巴巴西溪园区传出,Cydia的图标出现在一部iOS9.3.4的iPhone6上并成功运行 ...

  2. ASP.NET Core中显示自定义错误页面-增强版

    之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...

  3. ASP.NET安全

    ASP.NET 安全 概述 安全在web领域是一个永远都不会过时的话题,今天我们就来看一看一些在开发ASP.NET MVC应用程序时一些值得我们注意的安全问题.本篇主要包括以下几个内容 : 认证 授权 ...

  4. C#图片色彩的纠正-上

    WPF(C#)图片色彩的纠正-上 WPF(C#)图片色彩的纠正-下 前言 对图片进行色彩的纠正,其实与WPF是没有什么关系的,为什么标题又是“WPF(C#)图片色彩的纠正”呢,因为这些图片色彩的纠正功 ...

  5. django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5

    前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzhen ...

  6. Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)

    <Windows Azure Platform 系列文章目录> 前提要求: 1.假设笔者捕获一个Azure虚拟机模板,命名为leistorage 关于Azure虚拟机模板,请参考下图: 2 ...

  7. C#设计模式系列:迭代器模式(Iterator)

    迭代器模式把对象的职责分离,职责分离可以最大限度减少彼此之间的耦合程度,从而建立一个松耦合的对象.职责分离的要点是对被分离的职责进行封装,并以抽象的方式建立彼此之间的关系. 1.迭代器模式简介 1.1 ...

  8. bootstrap 学习

    <!DOCTYPE html> <html> <head> <title>Bootstrap</title> <meta name=& ...

  9. C#中使用Redis不同数据结构的内存占有量的疑问和对比测试

    最近在大量使用Redis来进行数据统计前的清洗和整理,每天的数据量超5千万+,在开发过程中,数据量小,着重注意业务规则的处理,在上线基本测试后发现了大量的问题,其中之一就是Redis存储数据过多,内存 ...

  10. Git 冲突合并

    在多人协作开发,经常遇到Git冲突,每次都不大记住命令.所以自己备注一下! git pull 之后有冲突: $ git pullremote: Counting objects: 5, done.re ...