#region 将ViewState持久化保持在服务器端
//如果你有一个非常酷的页面,页面上很多东西自动地响应用户操作而展现丰富的变化,你的ViewState是很有可能达到200K的。
//这里是将ViewState持久化保持在服务器端的代码,这样ViewState不占用网络带宽,因此其存取只是服务器的磁盘读取时间。
//并且它很小,可以说是磁盘随便转一圈就能同时读取好多ViewState,因此可以说“不占时间”。
//为了再“不占磁盘时间”,还使用了缓存。
//以下代码放在页面、或者页面的父类中。
/// <summary>
/// 1
/// </summary>
/// <returns></returns>
protected override object LoadPageStateFromPersistenceMedium()
{
var viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;
var stateObject = Cache[viewStateID];
if (stateObject != null)
return stateObject;
var fn = this.Server.MapPath("~/App_Data/ViewState/" + viewStateID);
var stateStr = File.ReadAllText(fn);
return new ObjectStateFormatter().Deserialize(stateStr);
}
/// <summary>
/// 2
/// </summary>
/// <param name="state"></param>
protected override void SavePageStateToPersistenceMedium(object state)
{
var viewStateID = (DateTime.Now.Ticks + this.GetHashCode()).ToString(); //产生离散的id号码
Cache.Insert(viewStateID, state);
var value = new ObjectStateFormatter().Serialize(state);
var fn = this.Server.MapPath("~/App_Data/ViewState/" + viewStateID);
ThreadPool.QueueUserWorkItem(obj => File.WriteAllText(fn, value));
base.SavePageStateToPersistenceMedium(viewStateID);
}
/// <summary>
/// 这段放到Global.asax中,也可以不管
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Application_Start(object sender, EventArgs e)
{
var dir = new DirectoryInfo(this.Server.MapPath("~/App_Data/ViewState/"));
if (!dir.Exists)
dir.Create();
else
{
var nt = DateTime.Now.AddHours(-1);
dir.GetFiles().ForEach(f =>
{
if (f.CreationTime < nt)
f.Delete();
});
}
}
#endregion