• 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;
                    }
                }
            }
  • 相关阅读:
    angular 封装http请求、解决跨域问题
    TCP协议数据读取
    Dart里继承extends和实现implements的区别
    MySQL通过frm和ibd恢复表结构和数据的办法【基于Linux和MySQL5.6.23测试】
    Dart里实现可增长List和定长List的runtimeType的toString()的值是一样的功能
    MySQL位判断
    SpringBoot URL参数解析坑
    android 实用抓取手机log方法(均为转载)
    python 创建动态类
    Mac技巧之苹果电脑上将一个软件进程的 CPU 占用率限制在指定范围内:cputhrottle
  • 原文地址:https://www.cnblogs.com/future/p/3872974.html
Copyright © 2020-2023  润新知