標籤:style blog http color 使用 os strong io
1.比較
Asp.net 的一個強大的功能就是ViewState, 但是這也成為很多人詬病的地方,我們先來看一個執行個體
ViewState其中一個特性就是儲存頁面的狀態,下面我們看一個很簡單的登入頁面。
(1) 預設的頁面儲存
下面兩幅圖是使用預設的ViewState, Asp.net把狀態儲存在頁面的一個Hidden控制項裡。每次請求時往返於用戶端與伺服器之間,我們可以看到儲存了很多的值,頁面大小是28.2K。
(2)自訂的Cache儲存
下面兩幅圖是我們使用自訂的Cache儲存,頁面的大小是27.5K,雖然不到1K,但這個頁面的結構比較簡單,如果複雜的,如用了GridView等,這個差別還是比較大的
(3)擴充
實際上ASP.NET2.0 給我們提供了改變儲存的功能,這個是通過覆蓋Page的PageStatePersister
protected override PageStatePersister PageStatePersister
而且ASP.NET2.0給內建了一個SessionPageStatePersister. 可以容易的把ViewState存到Session裡
return new SessionPageStatePersister(page);
2. 樣本
這裡我給出自訂的一個執行個體
(1)開發一個ViewStateFactory,根據不同的配置,修改儲存方式。
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.Caching;
namespace TestViewState
{
public enum ViewstateMode
{
Cache,
Session,
Page,
File,
Database
}
public class ViewStateFactory
{
public ViewStateFactory()
{
//
// TODO: Add constructor logic here
//
}
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,在基類裡覆蓋,所有的頁面整合這個頁面
protected override PageStatePersister PageStatePersister
{
get
{
ViewstateMode viewstateMode = ViewstateMode.Page;
try
{
switch (ConfigManager.ViewStateMode.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;
}
}
}