protected override object LoadPageStateFromPersistenceMedium()
{
string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second; // var 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 = this.Server.MapPath(@"~/App_Data/ViewState/" + viewStateID); //var fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
//ThreadPool.QueueUserWorkItem(obj => File.WriteAllText(fn, value));
File.WriteAllText(fn, value);
Cache.Insert(viewStateID, value);
base.SavePageStateToPersistenceMedium(viewStateID);
}下面这段可以放在Global.asax中,也可以根本不管:void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(this.Server.MapPath("~/App_Data/ViewState/"));
if (!dir.Exists)
dir.Create();
else
{
DateTime nt = DateTime.Now.AddHours(-1);
foreach (System.IO.FileInfo f in dir.GetFiles())
{
if (f.CreationTime < nt)
f.Delete();
}
}
}
以上是把viewstate 转存到硬盘的代码。我实现以后在web.config中禁用所有页面的viewstate
<pages enableSessionState="true" enableViewState="false" enableViewStateMac="false"/>有个奇怪的问题出现了,所有 DropDownList 的选择事件当你选择第一项时不会触发,选择其他项时一切正常。。求解!!!!强烈求解。我折腾这问题很久了,这问题把我折腾得很惨!!!
这个跟ViewState没有关系
重写LoadPageStateFromPersistenceMedium()
SavePageStateToPersistenceMedium(object state) 后不能响应。