1.比较

Asp.net 的一个强大的功能就是ViewState,  但是这也成为很多人诟病的地方,我们先来看一个实例

ViewState其中一个特性就是保存页面的状态,下面我们看一个很简单的登录页面。

(1) 默认的页面存储

下面两幅图是使用默认的ViewState, Asp.net把状态保存在页面的一个Hidden控件里。每次请求时往返于客户端与服务器之间,我们可以看到储存了很多的值,页面大小是28.2K。

(2)自定义的Cache存储

下面两幅图是我们使用自定义的Cache存储,页面的大小是27.5K,虽然不到1K,但这个页面的结构比较简单,如果复杂的,如用了GridView等,这个差别还是比较大的

(3)扩展

实际上ASP.NET2.0 给我们提供了改变存储的功能,这个是通过覆盖Page的PageStatePersister

protected override PageStatePersister PageStatePersister

而且ASP.NET2.0给内置了一个SessionPageStatePersister. 可以容易的把ViewState存到Session里

return new SessionPageStatePersister(page);

2. 示例

这里我给出自定义的一个实例

(1)开发一个ViewStateFactory,根据不同的配置,修改存储方式。

using System;

using System.Collections.Generic;

using System.Web;

using System.Web.UI;

using System.Web.Caching;

namespace TestViewState

{

public enum ViewstateMode

{

Cache,

Session,

Page,

File,

Database

}

public class ViewStateFactory

{

public ViewStateFactory()

{

//

// TODO: Add constructor logic here

//

}

public static PageStatePersister CreateViewState(ViewstateMode mode, Page page)

{

switch (mode)

{

case ViewstateMode.Cache:

return new CacheStatePersister(page);

case ViewstateMode.Session:

return new SessionPageStatePersister(page);

case ViewstateMode.Page:

case ViewstateMode.File:

case ViewstateMode.Database:

return new HiddenFieldPageStatePersister(page);

default:

return new HiddenFieldPageStatePersister(page);

}

}

}

//实现一个自定义的方式,存储到服务器的Cache里

public class CacheStatePersister : PageStatePersister

{

private Cache mCache = HttpRuntime.Cache;

public CacheStatePersister(Page page) : base(page) { }

public override void Load()

{

string _vskey = Page.Request.Form["_VIEWSTATE_KEY"];

if (_vskey == null)

{

base.ViewState = null;

}

else

{

base.ViewState = mCache[_vskey];

}

}

public override void Save()

{

string _vskey;

_vskey = "VIEWSTATE_" + HttpContext.Current.Session.SessionID + "_" + Page.Request.RawUrl +

"_" + System.DateTime.Now.Ticks.ToString();

mCache.Add(_vskey, base.ViewState, null,

System.DateTime.Now.AddMinutes(HttpContext.Current.Session.Timeout), Cache.NoSlidingExpiration,

CacheItemPriority.Default, null);

this.Page.RegisterHiddenField("_VIEWSTATE_KEY", _vskey);

}

}

}

(2)为了可以配置,我们在Web.config的AppSetting里加上

<!--this is for where save viewstate, correct value is Cache, Page, Session-->

<add key="ViewStateMode" value="Cache"/>

(3)覆盖页面的PageStatePersister,这里你可以开发一个BasePage,在基类里覆盖,所有的页面集成这个页面

protected override PageStatePersister PageStatePersister

{

get

{

ViewstateMode viewstateMode = ViewstateMode.Page;

try

{

switch (ConfigManager.ViewStateMode.ToLower())

{

case "cache":

viewstateMode = ViewstateMode.Cache;

break;

case "session":

viewstateMode = ViewstateMode.Session;

break;

default:

viewstateMode = ViewstateMode.Page;

break;

}

return ViewStateFactory.CreateViewState(viewstateMode, this.Page);

}

catch (Exception ex)

{

return base.PageStatePersister;

}

}

}

最新文章

  1. SharePoint常用目录介绍
  2. ASP.NET MVC系列:控制器的Edit方法
  3. 总结Gerrit常用命令
  4. 使用git管理代码的心得
  5. Delphi 7事件的多处理机制
  6. tp框架链接数据库的基本操作
  7. nnet3bin/nnet3-xvector-compute.cc
  8. linux下几个常用软件
  9. 关于sql server的一种简单用法——在上面写查询语句,即可在下面修改数据
  10. Eclipse中XML文件自定义格式化配置
  11. Spring Cloud 入门教程(三): 配置自动刷新
  12. Robot Operating System (ROS)学习笔记2---使用smartcar进行仿真
  13. WordPress主题开发:网站搜索
  14. top命令参数
  15. K8S之Secret
  16. [Agc002E]Candy Piles
  17. Content portal for Pocketables Tasker articles
  18. HDUOJ----More is better(并查集)
  19. BEAUTIFUL
  20. 对自写的Asp.Net分页控件的应用方式(异步无刷新分页)

热门文章

  1. in_array函数的第三个参数 strict
  2. Mac下配置Maven
  3. Javascript学习笔记1 数论
  4. C++ 第一次上机作业
  5. Android屏幕适应详解(二)
  6. C# 和Jsonp的一个小demo 用jQuery与JSONP轻松解决跨域访问的问题
  7. IOS笔记 #pragma mark的用法和作用(方便查找和导航代码)
  8. Gvim for php 安装配置
  9. jenkins忘记管理员账号密码的补救方法-转
  10. BFS+贪心 HDOJ 5335 Walk Out