標籤:style blog http color 使用 os 檔案 io
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; } } }