原文摘自:去掉.net页面中的input type=hidden name=__VIEWSTATE id=__VIEWSTATE
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
// 添加引用
using System.IO;
using System.Threading;
namespace CCL
{
/// <summary>
/// BasePage 的摘要说明
/// </summary>
public class BasePage : System.Web.UI.Page
{
#region 解决ViewState 过于庞大的问题
// 由于这里添加了目录, 所以要建立App_Data/ViewState 目录.
protected override object LoadPageStateFromPersistenceMedium()
{
string viewStateID = ( string )((Pair) base .LoadPageStateFromPersistenceMedium()).Second;
string stateStr = ( string )Cache[viewStateID];
if (stateStr == null )
{
string fn = Path.Combine( this .Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
stateStr = File.ReadAllText(fn);
}
return new ObjectStateFormatter().Deserialize(stateStr);
}
protected override void SavePageStateToPersistenceMedium( object state)
{
string value = new ObjectStateFormatter().Serialize(state);
string viewStateID = (DateTime.Now.Ticks + ( long ) this .GetHashCode()).ToString(); // 产生离散的id 号码
string fn = Path.Combine( this .Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
//ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));
File.WriteAllText(fn, value);
Cache.Insert(viewStateID, value);
base .SavePageStateToPersistenceMedium(viewStateID);
}
#endregion
}
}
不使用Session ,因为它会“ 丢失” 。ViewState 保存在磁盘上,即使服务器重新启动,也不会丢失页面状态。
下面这段可以放在Global.asax 中,也可以根本不管:
C# code
protected void Application_Start(object sender, EventArgs e)
{
DirectoryInfo dir = new DirectoryInfo (this .Server.MapPath("~/App_Data/ViewState/" ));
if (!dir.Exists)
dir.Create();
else
{
DateTime nt = DateTime .Now.AddHours(-1);
foreach (FileInfo file in dir.GetFiles())
{
if (file.CreationTime < nt)
file.Delete();
}
}
}