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 应用程序 服务器内存 应用程序的周期 ...
随机推荐
- 负载均衡的场景下ASP.NET Core如何获取客户端IP地址
在ASP.NET中,使用负载均衡时,可以通过ServerVariables获取客户端的IP地址. var ip = request.ServerVariables["HTTP_X_FORWA ...
- MySQL HASH分区
200 ? "200px" : this.width)!important;} --> 介绍 基于给定的分区个数,将数据分配到不同的分区,HASH分区只能针对整数进行HASH ...
- sqlalchemy(一)基本操作
sqlalchemy(一)基本操作 sqlalchemy采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型. 安装 需要安装MySQLdb pip install ...
- 測試大型資料表的 Horizontal Partitioning 水平切割
FileGroup 檔案群組 :一個「資料庫(database)」可對應一或多個 FileGroup,一個 FileGroup 可由一或多個 file (.ndf) 構成. FileGroup 可讓 ...
- C语言 · 十六进制转十进制
问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~15分别用大写的英文字母A.B.C.D.E.F表示. 样例输入 FFFF 样例输出 6 ...
- C语言 · 回文数
问题描述 1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数. 输出格式 按从小到大的顺序输出满足条件的四位十进制数. 方案一: int main(){ int ...
- 《Entity Framework 6 Recipes》中文翻译系列 (25) ------ 第五章 加载实体和导航属性之加载完整的对象图和派生类型上的导航属性
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-5 加载完整的对象图 问题 你有一个包含许多关联实体的模型,你想在一次查询中, ...
- iOS-开发者相关的几种证书
目录 引言 写在前面 一App IDbundle identifier 二设备Device 三开发证书Certificates 证书的概念 数字证书的概念 iOS开发证书 iOS开发证书的根证书 申请 ...
- SikuliX简介及安装
一.简单介绍 SikuliIDE和Sikuli Script就是现在的SikuliX,最新版本是SikuliX1.1.0, 部分兼容Sikuli JAVA API,支持Python和Ruby,Siku ...
- jQuery 2.0.3 源码分析 样式操作
根据API分类 CSS addClass() jQuery.cssHooks .hasClass() .removeClass() .toggleClass() .addClass() 对元素的样式操 ...