没有问题,散分贴:如果你必须开发交互式页面,ViewState越大可能意味着越有本事
如果你有一个非常酷的页面,页面上很多东西自动地响应用户操作而展现丰富的变化,你的ViewState是很有可能达到200K的。
这里是我将ViewState持久化保持在服务器端的代码,这样ViewState不占用网络带宽,因此其存取只是服务器的磁盘读取时间。并且它很小,可以说是磁盘随便转一圈就能同时读取好多ViewState,因此可以说“不占时间”。为了再“不占磁盘时间”,我还使用了缓存。
一下这段代码可以放在页面中,或者页面的父类中:
protected override object LoadPageStateFromPersistenceMedium(){ var viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second; var stateStr = (string)Cache[viewStateID]; if (stateStr == null) { var 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){ var value = new ObjectStateFormatter().Serialize(state); var viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码 var fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID); ThreadPool.QueueUserWorkItem(obj => File.WriteAllText(fn, value)); Cache.Insert(viewStateID, value); base.SavePageStateToPersistenceMedium(viewStateID);}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(); }); }}
學習
加強
[解决办法]
学习
[解决办法]
学习
[解决办法]
mark
[解决办法]
var viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;???
var也出来了?
[解决办法]
[解决办法]
学习了,楼主好强大.
[解决办法]
做个标记!以后慢慢看,虽然不是很明白,但是要学习楼主的精神!
viewstate不知道为什么会弄到200k,我基本很少放大的东西,顶多一些id传送之类的!不知楼主应用什么东西
会+到200k,请教ing
www.54reader.com欢迎访问我的网站!谢谢
[解决办法]
有点意思~~
[解决办法]
ViewState?缓存?
500个用户在线,你的磁盘上就要放500*200K的空间.
500个用户每人一个ViewState的缓存?
何况你来回的序列化...
[解决办法]
我来学习的
[解决办法]
挺難的~~~
[解决办法]
学习
[解决办法]
mark先
[解决办法]
不错:)
[解决办法]