ViewState 的使用,大家可以说是又爱又恨,它其中一个特性就是保存页面的状态,对于只是展示的页面,我们可以直接在页面文件中使用 EnableViewState="false" 来将其屏蔽,但是很多时候,我们不得不使用它,可是它产生的页面冗长的html代码有让我们很头疼,下面介绍一种ViewState压缩机制。主要是通过重写 PageStatePersister 来实现。

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

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.Caching;
namespace Common
{
public enum ViewstateMode
{
Cache,
Session,
Page,
File,
Database
} public class ViewStateFactory
{
public ViewStateFactory()
{
} 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里加上
<add key="ViewStateMode" value="Cache"/>  

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

        //重写PageStatePersister,用于压缩ViewState
protected override PageStatePersister PageStatePersister
{
get
{
ViewstateMode viewstateMode = ViewstateMode.Page;
try
{
switch (System.Configuration.ConfigurationManager.AppSettings["ViewStateMode"].ToString().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;
}
}
}

ViewState压缩技术的更多相关文章

  1. Java后端实现图片压缩技术

    今天来说说图片压缩技术,为什么要使用图片压缩,图片上传不就完事了吗?对的,这在几年前可以这么说,因为几年前还没有现在这么大的并发,也没有现在这么关注性能. 如今手机很多,很多人都是通过手机访问网络或者 ...

  2. C语言中的内存压缩技术

    C语言中的内存压缩技术 前言 在整个研究生阶段我都在参与一个LTE协议栈实现的项目,在这个项目中,我们利用一个自己编写的有限状态机框架将协议栈中每一层实现为一个内核模块.我们知道,在编写内核代码时需要 ...

  3. 转:关于数据库压缩技术的Survey

    原文来自于:http://outofmemory.cn/mysql/database-compression-tech 昨天给团队内的小伙伴做了一个关于数据库压缩技术的Survey,现将其中可以公开的 ...

  4. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

  5. 【RMAN】使用RMAN的 Compressed Backupsets备份压缩技术 (转载)

    1.Oracle参考文档中关于RMAN备份压缩的描述1)关于如何通过调整RMAN参数启用取消备份压缩功能http://download.oracle.com/docs/cd/B19306_01/bac ...

  6. 【洛谷p1319】压缩技术

    (许久不见,甚是想念) 压缩技术[传送门] 洛谷上滴算法标签: 然而这是一道入门难度的题.(不管不管,就写它了) 好的先说一下思路吧wait!我忘记了咋做的当时. 首先做题第一道坎儿,如何输入若干个( ...

  7. app瘦身和包压缩技术有什么区别?

    APP瘦身 针对app文件中的文件进行优化,利用素材的拉伸,祛除不必要的文件,优化png, jpg素材,压缩音视频素材等方式实现app文件的减小. 包压缩技术 所谓包压缩,顾名思义就是将手游的安装包体 ...

  8. 手游包压缩技术引领手游行业实现app页游化

    近些年,掌上游戏时代已经成为全民风尚,但身为游戏开发商考虑过手游安装包大小与用户转化率之间的关系吗? 随着手机游戏市场发展愈发壮大,行业发展愈加成熟,手游厂商愈来愈多,手游产业也进入了优胜劣汰的环节, ...

  9. Hive 压缩技术Data Compression

    Mapreducwe 执行流程 :input > map > shuffle > reduce > output 压缩执行时间,map 之后,压缩,数据存储在本地磁盘,减少磁盘 ...

随机推荐

  1. extjs4与ckeditor、ckfinder整合

    <script type="text/javascript"src="<?php echo Yii::app()->request->baseUr ...

  2. 【转载】一淘技术专家王晓哲:Nginx_lua的测试及选择

    对于Web高性能服务器上的选择,这个是很多人头痛的问题.其实Apache.lighttpd.Nginx都用他们优点,在什么情况下我们如何去选择适合自己的Web高性能服务器,如何去搭建一个适合自己的架构 ...

  3. 你用什么工具开发JavaScript?

    Cloud9的CFO曾经在LinkedIn上面发起一个调查,原标题为:What tools do you use for Node.js development?,回贴者甚多. 目测很多人都使用VIM ...

  4. MYSQL注入天书之宽字节注入

    Background-7 宽字节注入 Less-32,33,34,35,36,37六关全部是针对'和\的过滤,所以我们放在一起来进行讨论. 对宽字节注入的同学应该对这几关的bypass方式应该比较了解 ...

  5. Smarty模板学习

    1.基本语法 所有的smarty模板标签都被加上了定界符.默认情况下是 { 和},但它们是可被改变的. 在smarty里,所有定界符以外的内容都是静态输出的,或者称之为不可改变.当smarty遇到了模 ...

  6. HDU 2671 Can't be easier(数学题,点关于直线对称)

    题目 //数学题//直线 y = k * x + b//直线 ax+by+c=0; 点 (x0,y0); 点到直线距离 d = (ax0+by0+c)/sqrt(a^2+b^2) /********* ...

  7. Android调用天气预报的WebService简单例子

    下面例子改自网上例子:http://express.ruanko.com/ruanko-express_34/technologyexchange5.html 不过网上这个例子有些没有说明,有些情况不 ...

  8. Nutch配置:nutch-default.xml详解

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  9. hdu 3590 PP and QQ 博弈论

    思路: 在贾志豪神牛的论文 里,这两种游戏都有 其中树的删边游戏:叶子节点的SG值为0:中间节点的SG值为它的所有子节点的SG值加1 后的异或和. ANTI-SG:先手必胜当且仅当:(1)游戏的SG函 ...

  10. MongoDB (七) MongoDB 数据类型

    MongoDB支持许多数据类型的列表下面给出: String : 这是最常用的数据类型来存储数据.在MongoDB中的字符串必须是有效的UTF-8. Integer : 这种类型是用来存储一个数值.整 ...