备注:

ASP.NET 页可在处理和提供任何网页所必需的原本无状态 HTTP 请求与响应之间存储 Page 状态信息。此状态称为“视图状态”。

ASP.NET 的默认持久性机制是使用 HiddenFieldPageStatePersister 类将视图状态存储在客户端。使用各个 HTTP 请求和响应来存储视图状态和数据在大体上来说效果良好,而且在大型 Web 场方案中非常重要,因为由哪台 Web 服务器来处理该请求并不重要:当前上下文中提供了页状态,因此服务器可以准确地呈现该页。

在将页提供给客户端资源有限或所用标记语言不支持隐藏字段元素的小型设备时,需要将视图状态存储在服务器上。一些 ASP.NET 设备页适配器重写 GetStatePersister 方法以返回一个 SessionPageStatePersister 对象,该对象将页状态存储在服务器上与客户端关联的会话对象中。

Asp.net1.1里的Viewstate,我们可以看作是在页面加入一个隐藏域,将页面状态进行保存,所以我们在html源码里常见到如下类似代码:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPaA8FDzhjNzkyNTMzNjE1YWEyNxgBBQlHcmlkVmlldzEPZ2QZw
44JLJFcglwRl9TiNliE82yAuQ==" />
如果我们想将其状态保存到session里,必须手动操作;Asp.net2.0里就简单了。

Asp.net2.0里用来维护页面状态的2种页面属性:HiddenFieldPageStateSessionPageStatePersister
前一种类似以前1.1里的viewstate行为,主要看后一种。

通过一个例子,可以更形象了解SessionPageStatePersister

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

protected override PageStatePersister PageStatePersister { get { return new SessionPageStatePersister(this); } }

 protected override void OnLoad(EventArgs e) {   
     base.OnLoad(e);  
      if (!IsPostBack) {   
         ArrayList list = new ArrayList(); 
           for (int i = 0; i < 1000; i++)          
 {        
 list.Add(Convert.ToString(i));  
          }           
 GridView1.DataSource = list;   
         GridView1.DataBind();    
          }   
 }
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server"> 
<title>Untitled Page</title></head><body>  
  <form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" />
 <asp:Button ID="Button1" runat="server" Text="Submit" /></div>    
</form></body></html>

高亮部分注

释掉再次运行,比较html源码可以看到页面状态真的保存到session里去了(不注释掉时)。

使用方法1:我们可以构造一个basepage,需要的话,后续页面继承自basepage
public class PagePersisterBasePage : Page
{
    public PagePersisterBasePage()   {
    }
    protected override PageStatePersister PageStatePersister {
        get {
            return new SessionPageStatePersister(this);
        }
    }
}
===================
<%@ Page Language="C#"  Inherits="PagePersisterBasePage" %>

使用方法2:在web.config里设置
<?xml version="1.0"?>
<configuration>
   <system.web>
    <pages pageBaseType="PagePersisterBasePage" />
   </system.web>
</configuration>
-----------------注意这时“影响范围”与方法1是不同的-----------------

Asp.net2.0里的SessionPageStatePersister的更多相关文章

  1. 在ASP.NET2.0里打印网页指定的内容(比如打印网页里的一个Table)

    原文:在ASP.NET2.0里打印网页指定的内容(比如打印网页里的一个Table) 打印指定内容: <html> <head> <script   type= " ...

  2. 【IHttpHandler】在ASP.Net2.0中使用UrlRewritingNet实现链接重写

    很多时候我们需要链接转向(Url Rewriting),例如二级域名转向.文章访问链接等场合. 让我们看两个例子: 1 你现在看到的当前作者的博客园的域名: http://jx270.cnblogs. ...

  3. asp.net2.0安全性(2)--用户个性化设置(1)--转载来自车老师

    在Membership表中可以存储一些用户的基本信息,但有的时候,我们需要记录的用户信息远远不止Membership表中提供的这些,如QQ.MSN.家庭住址.联系电话等等.那如何把这些用户信息记录到数 ...

  4. asp.net2.0安全性(2)--用户个性化设置(2)--转载来自车老师

    上一篇我们用Profile.age等方式可以读取用户的年龄和其它的信息,但有的时候我们要查询显示所有用户的信息,但asp.net没有提供查询所有用户信息的功能,我们只能对现有的用户逐一查询其Profi ...

  5. asp.net2.0安全性(3)--验证与授权--转载来自车老师

    "验证"与"授权"是对网页资源安全管理的两道门. 验证(Authentication):检查用户是否是合法的用户.就像是网站大门口的保卫,服责验证使用的用户名和 ...

  6. asp.net2.0安全性(1)--用户角色篇(类)--转载来自车老师

    Membership.MembershipUser和Roles类 用户与角色管理在asp.net2.0中是通过Membership和Roles两个类来实现的. Membership:用户成员账号管理, ...

  7. asp.net2.0安全性(1)--用户角色篇(起篇)--转载来自车老师

    安全管理的解决方案在.net1.1中几乎为一片空白,对于应用程序的验证与授权大部分的工作是开发人员自己编写代码,或者是借助企业库等工具来实现,此可谓.net1.1中的一大缺憾.在.net2.0中微软为 ...

  8. Asp.Net2.0下C#环境 Login控件实现用户登录

    原文:Asp.Net2.0下C#环境 Login控件实现用户登录 一.前台显示效果 二.前台代码             <asp:Login ID="Login1" run ...

  9. ASP.NET2.0组件控件开发视频 初体验

    原文:ASP.NET2.0组件控件开发视频 初体验 ASP.NET2.0组件控件开发视频 初体验 录了视频,质量不是很好,大家体验下.我会重新录制的 如果不清楚,可以看看http://v.youku. ...

随机推荐

  1. 《深入理解Spark-核心思想与源码分析》(四)第四章存储体系

    天行健,君子以自强不息:地势坤,君子以厚德载物.——<易经> 本章导读 Spark的初始化阶段.任务提交阶段.执行阶段,始终离不开存储体系. Spark为了避免Hadoop读写磁盘的I/O ...

  2. [转]spring tx:advice 和 aop:config 配置事务

      <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www. ...

  3. 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) A. Orchestra 水题

    A. Orchestra 题目连接: http://www.codeforces.com/contest/635/problem/A Description Paul is at the orches ...

  4. #Java Web累积#JS动态加载所有同name的select的option

      项目需求: 某一页面,页面使用多列table,每个table中有同相同的<select>,select的option不确定,根据Server端的配置来,所以option需要动态加载: ...

  5. NHibernate之一级缓存(第十篇)

    NHibernate的一级缓存,名词好像很牛B,很难.实际上就是ISession缓存.存储在ISession的运行周期内.而二级缓存则存储在ISessionFactory内. 一.ISession一级 ...

  6. Android 卡顿优化 1 卡顿解析

    1, 感知卡顿 用户对卡顿的感知, 主要来源于界面的刷新. 而界面的性能主要是依赖于设备的UI渲染性能. 如果我们的UI设计过于复杂, 或是实现不够好, 设备又不给力, 界面就会像卡住了一样, 给用户 ...

  7. JS中for和forEach的区别

    https://thejsguy.com/2016/07/30/javascript-for-loop-vs-array-foreach.html

  8. 在执行migrate的时候出现问题(错误见末尾): django.db.utils.OperationalError: (1045, "Access denied for user ‘ODBC‘@‘localho st‘ (using password: YES)")

    Python框架之Django的数据库 在执行migrate的时候出现问题(错误见末尾) django.db.utils.OperationalError: (1045, "Access d ...

  9. stylus使用文档总结:选择器+变量+插值+运算符+混合书写+方法

    建立好项目后我们来安装stylus npm install stylus stylus-loader --save-dev 这样就安装上了stylus. 接下来就可以使用了,使用方式分两种.一种是在. ...

  10. TestNG 六 测试结果

    一.成功.失败和断言 如果一个测试没有抛出任何异常就完成运行或者说抛出了期望的异常(参见@Test注解的expectedExceptions属性文档),就说,这个测试时成功的. 测试方法的组成常常包括 ...