sessionPageState与视图状态存储
这个配置节甚是简单,在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
sessionPageState与视图状态存储的更多相关文章
- Atitit 视图状态ViewState)的原理与管理
Atitit 视图状态ViewState)的原理与管理 1.1. 视图状态ViewState的实现隐藏字段和url参数1 1.2. Asp.net的视图状态管理1 2. 1 2.1. H5的视图 ...
- ASP.NET - 视图状态概述
本文转载自dodream 视图状态是 ASP.NET 页框架用于在往返过程之间保留页和控件值的方法.在呈现页的 HTML 标记时,必须在回发过程中保留的页和值的当前状态将被序列化为Base64 编码字 ...
- C# 问题解决思路--《数组bytes未定义》,ASP.NET页面加载顺序
好久没写博客了,废话不多说,直接说问题. 问题发生情况,首先这个是老项目,然后我是第一次修改.当我解决了各种引用,数据库配置之后等类似的问题,我启动的项目的时候,无任何问题,但是当我点击页面的按钮的时 ...
- ASP.NET状态管理策略
如果要想把信息存储在客户端那可以选择视图状态.控件状态.隐藏字段.cookie.和查询字符串. 1.web窗体页提供viewstate属性作为内置结构,在同一页的多个请求间自动保留值.他作为页面的隐藏 ...
- ASP.NET中的状态保持(转载)
状态是某一类型的数据在一定时期内保持活跃的信息.这里说的一定时期可以使整个应用程序的生命周期,可以使用户操作程序的时间,当然也可以是单个页面的生命周期等. 为了解决传统Web编程中固有的限制,ASP ...
- 关于asp.net中页面事件加载的先后顺序
一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件 ...
- Asp.net2.0里的SessionPageStatePersister
备注: ASP.NET 页可在处理和提供任何网页所必需的原本无状态 HTTP 请求与响应之间存储 Page 状态信息.此状态称为“视图状态”. ASP.NET 的默认持久性机制是使用 HiddenFi ...
- 页面事件(Init,Load,PreRender)执行顺序
简介 对由 Microsoft® Internet 信息服务 (IIS) 处理的 Microsoft® ASP.NET 页面的每个请求都会被移交到 ASP.NET HTTP 管道.HTTP 管道由一系 ...
- .NET Application,Session,Cookie,ViewState,Cache对象用法
作用域 保存地址 生命周期Application 应用程序 服务器内存 IIS启动Session 整个站点 服务器内存 Session到时 默认20分钟Cashe 应用程序 服务器内存 应用程序的周期 ...
随机推荐
- Visual Studio 2015 CTP6 发布
微软发布ASP.NET 5 支持在Windows.Mac和Linux上构建程序,Visual Studio 2015 CTP6(社区预览版)现已发布了.感兴趣的朋友们可以登录官网下载[http://w ...
- .NET Framework 4.5.2 静默安装参数
Microsoft .NET Framework 4.5.2 是针对 Microsoft .NET Framework 4.Microsoft .NET Framework 4.5 和 Microso ...
- 多种坐标系之间的转换 Proj.NET和DotSpatial
Proj.NET ( http://projnet.codeplex.com/)是一个.NET下开源的空间参照和投影引擎,遵循OGC相关标准.负责人(Coordinators )是D_Guidi 和S ...
- 微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析
作者:蒸米@阿里移动安全 序言 微信作为手机上的第一大应用,有着上亿的用户.并且很多人都不只拥有一个微信帐号,有的微信账号是用于商业的,有的是用于私人的.可惜的是官方版的微信并不支持多开的功能,并且频 ...
- 玩转Windows服务系列——Windows服务启动超时时间
最近有客户反映,机房出现断电情况,服务器的系统重新启动后,数据库服务自启动失败.第一次遇到这种情况,为了查看是不是断电情况导致数据库文件损坏,从客户的服务器拿到数据库的日志,进行分析. 数据库工作机制 ...
- ubuntu下rhythmbox歌名显示乱码问题解决
问题描述:本人装有双系统,一个是win7,另一个是ubuntu12.04LTS版本,所有的歌曲都在windows磁盘下KuGou目录中,这个时候,使用ubuntu的rhythmbox播放的歌曲的时候, ...
- 解决记录日志导致VS2013缓慢的问题
最近VS2013启动时.编译时.显示项目属性速度狂慢,遇到项目多的,显示项目属性时甚至VS挂掉. 把所有的VS插件卸载.甚至重装VS也不见效果. 用ProcessMonitor发现VS一直在Defau ...
- UITest 单元测试常用的断言
XCTFail(format…) 生成一个失败的测试: XCTFail(@"Fail"); XCTAssertNil(a1, format...) 为空判断, a1 为空时通过,反 ...
- MySQL外键之级联
简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...
- android 获取屏幕宽度和高度
// 获取屏幕宽高(方法1) int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480p ...