首页 > 代码库 > ViewState压缩技术

ViewState压缩技术

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=http://www.mamicode.com/"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;                }            }        }