ViewState压缩技术

    技术2022-05-18  8

    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里加上

    <!--this is for where save viewstate, correct value is Cache, Page, Session--> <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代码从9页Word文档的大小减小为以下一行

    <input type="hidden" name="_VIEWSTATE_KEY" id="_VIEWSTATE_KEY" value="VIEWSTATE_li3v0l30keovxerbolgvqcyl_/bbs/69548.html_634365820127654509" /> <input type="hidden" name="__VIEWSTATE" id=" __VIEWSTATE" value="" />

     


    最新回复(0)