这个配置节甚是简单,在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. Building Modern Web Apps-构建现代的 Web 应用程序(一些感想)

    <iframe src="http://channel9.msdn.com/Series/MVA-China/Web20140611A01/player?h=540&w=960 ...

  2. Expert 诊断优化系列------------------内存不够用么?

    现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是 ...

  3. 现在创业做App,先做 Android 还是 iOS?

    随着互联网+的高速发展,现在创业大部分都是在布局移动端,初期往往摆在面前最大的难题是,如何分配有限的成本,在最快的速度内占领市场?这个大难题会影响创始人在团队和产品建设方方面面的决定.缩小至移动App ...

  4. 微冷的雨Java基础学习手记(一)

    使用Java理解程序逻辑 之凌波微步 船舶停靠在港湾是很安全的,但这不是造船的目的 北大青鸟五道口原玉明老师出品 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识点时,要 ...

  5. WCF 的 Service Instance模式和并发处理

    WCF 的 Service Instance(实例)有三种模式 PerCall:每一次调用都创建一个实例,每一次调用结束后回收实例.此模式完全无状态. PerSession:调用者打开Channel时 ...

  6. 基于空项目模板创建使用Owin来host的WebApi项目

    首先创建一个空的web项目,如下图所示: 项目创建成功以后,安装下面三个package. Install-Package Microsoft.AspNet.WebApi -Version 5.2.2I ...

  7. python 邮件基础篇

    python 操作邮件,不是很方便,说实话还不是理解的特别透彻,这次想把自己碰到的东西总结下来 邮件有imap,pop,imap协议,这次使用的是imap4协议,主要用了imap4和mail类, 代码 ...

  8. ArchLinux安装指南

    将ArchLinux作为进阶Linux发行版,主要看重滚动更新和深入理解Linux的安装过程. 由于是新手,所以先选择在公司电脑上用VMware来安装.然后渐进到借助U盘在win10笔记本上安装双系统 ...

  9. 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"

    [深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...

  10. IOS 开发中 Whose view is not in the window hierarchy 错误的解决办法

    在 IOS 开发当中经常碰到 whose view is not in the window hierarchy 的错误,该错误简单的说,是由于 "ViewController" ...