刘刚博客

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="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;
                }
            }
        }

 

posted @ 2014-07-28 13:42  Future.Net博客  阅读(267)  评论(0编辑  收藏  举报