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

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

时间: 2024-11-18 12:54:10

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

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

Atitit  视图状态ViewState)的原理与管理   1.1. 视图状态ViewState的实现隐藏字段和url参数1 1.2. Asp.net的视图状态管理1 2. 1 2.1. H5的视图状态管理1 2.2. Java Jsp和php的视图状态管理1 2.3. Cs桌面程序的视图状态管理1 3. 参考1   1.1. 视图状态ViewState的实现隐藏字段和url参数   1.2. Asp.net的视图状态管理 1.3. H5的视图状态管理 读取url参数,客户端req对象获取.

asp.net-页面生命周期

WebForm生命周期 浏览器=>网站服务器=>IIS=>IsAPI=>ASP.NET WebForm=>初始化page=>加载视图和post数据=>Page Load 页面加载=>处理按钮事件=>保存数据到ViewState=>渲染页面成HTML返回给IIS=>返回给用户浏览器 viewstate优缺点 (1)优点: 耗费的服务器资源较少(与Application.Session相比).因为,视图状态数据都写入了客户端计算机中. 易于维护

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

一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件不会从内容页发送到母版页.同样,也不能在内容页中处理来自母版页控件的事件. 在某些情况下,内容页和母版页中会引发相同的事件.例如,两者都引发 Init 和 Load 事件.引发事件的一般规则是初始化事件从最里面的控件向最外面的控件引发,所有其他事件则从最外面的控件向最里面的控件引发. 请记住,母版页

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

简介 对由 Microsoft® Internet 信息服务 (IIS) 处理的 Microsoft® ASP.NET 页面的每个请求都会被移交到 ASP.NET HTTP 管道.HTTP 管道由一系列托管对象组成,这些托管对象按顺序处理请求,并将 URL 转换为纯 HTML 文本.HTTP 管道的入口是 HttpRuntime 类.ASP.NET 结构为辅助进程中的每个 AppDomain 创建一个此类的实例.(请注意,辅助进程为每个当前正在运行的 ASP.NET 应用程序维护一个特定的 Ap

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

好久没写博客了,废话不多说,直接说问题. 问题发生情况,首先这个是老项目,然后我是第一次修改.当我解决了各种引用,数据库配置之后等类似的问题,我启动的项目的时候,无任何问题,但是当我点击页面的按钮的时候,就报类型的错误. 因此,我按照我个人的经验,做出排查. 1.首先是代码问题,我根据按钮找到对应的后台事件,然后加上断点,发现根本就不进对应的断点.(说明不是按钮的后台代码的错误) 2.有可能是整个页面的后台代码的其他的错误,因此我搜索了该后台代码  看是否哪里出现了 bytes这个数组,结果没有

nginx 负载均衡、用数据库存储Session,来实现多站点共享Session[转]

多站点共享Session常见的作法有: 1.使用.net自动的状态服务(Asp.net State Service); 2.使用.net的Session数据库: 3.使用Memcached. 4.使用Cookie方式实现多个站点间的共享(这种方式只限于几个站点都在同一域名的情况下): 这里我们就 演练一下 以数据库的形来存储Session,来实现多站点共享Session. 首先我们 建好一下站点,如下图: Default.aspx 其中 有二个Button  ,SetSession 主要是用于给

【读书笔记《Android游戏编程之从零开始》】20.游戏开发基础(游戏数据存储)

对于数据的存储,Android 提供了4种保存方式. (1)SharedPreference 此方法适用于简单数据的保持,文如其名,属于配置性质的保存,不适合比较大的情况,默认存放在手机内存里 (2)FileInputStream/FileOutputStream 此方式比较适合游戏的保存和使用,流文件数据存储可以保持较大的数据,而且通过此方式不仅能把数据存储在手机内存中,也能将数据保存到手机额SDcard中. (3)SQLite 此方式也适合游戏的保存和使用,不仅可以保存较大的数据,而且可以将

ASP.NET页面中去除VIEWSTATE视图状态乱码

首先声明下这篇文章:本文章的发表于2014-10-11日,原作者和版权所有:KoalaAPI(还是本人啦),原链接:http://www.cnblogs.com/KoalaAPI/p/4018727.html(曾被删除!) 保存页的所有视图状态信息和控件状态信息. 作者在早期参与的项目中曾遇到这样的需求:基于SEO技术的开发,当因为时没有接触的MVC框架的 Razor 引擎,所以只能用ASP.NET引擎,如果使用ASP.NET引擎的服务器端控件,那么在ASP.NET页面中就会生成 __Views

ASP.NET Core——状态管理之视图状态

在实际项目中,常常需要保存用户信息来简化掉一些不必要的重复动作,提供人性化和智能的交互方式.然而HTTP协议是无状态的,每个新页面请求都是接.ASP.NET提供了保存状态的不同选项,使得状态额可以在客户端或服务器上保存. 要在客户端保存状态,ASP.NET提供了视图状态.cookie和参数选项.因为安全问题,使用这些状态有一些限制.在服务器端可以使用会话对象.全局应用程序状态.缓存和用户配置文件来保存状态. ASP.NET也提供了一些用于访问状态管理功能的属性.例如,HttpSessionSta