没有问题,散分贴:如果你必须开发交互式页面,ViewState越大可能意味着越有本事
如果你有一个非常酷的页面,页面上很多东西自动地响应用户操作而展现丰富的变化,你的ViewState是很有可能达到200K的。
这里是我将ViewState持久化保持在服务器端的代码,这样ViewState不占用网络带宽,因此其存取只是服务器的磁盘读取时间。并且它很小,可以说是磁盘随便转一圈就能同时读取好多ViewState,因此可以说“不占时间”。为了再“不占磁盘时间”,我还使用了缓存。
一下这段代码可以放在页面中,或者页面的父类中:
- C# code
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);}不使用Session,因为它会“丢失”。ViewState保存在磁盘上,即使服务器重新启动,也不会丢失页面状态。
下面这段可以放在Global.asax中,也可以根本不管:
- C# code
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(); }); }}这可以确保绝对稳定可靠地工作。以后请放心使用ViewState,把交互式页面提高水平才是最重要的,不要纠缠在“ViewState太大”上。实际上,由于页面设计不够酷,交互变化看上去不够丰富,ViewState实在是太小太小了。
如果你使用了它有效提高了复杂交互页面的效率,可以说一下提高了多少?!如果你觉得没用,也可以说一下在什么情况下没用。
[解决办法]
代码有点难,我是一位刚学的新手,不过,这样的代码可能很有用
[解决办法]
深奥,看不懂
[解决办法]
放进我的网摘
[解决办法]
我也看不懂啊!
呵呵!
[解决办法]
mark
[解决办法]
mark
[解决办法]
up
[解决办法]
学习
[解决办法]
我见书上说ViewState大了影响通信量,尤其是当数据很大时候,不知道我的理解有没有错(有的书上说可以禁用不必要的ViewState)
[解决办法]
个人认为不可取,只能适合一些小型应用
[解决办法]
收藏~3Q
[解决办法]
做个记号 加入搜藏,呵呵。接分。。!!
[解决办法]
放进我的网摘
[解决办法]
记号~
[解决办法]
加
[解决办法]
学习
[解决办法]
学习
[解决办法]
mark
[解决办法]
var viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;???
var也出来了?
[解决办法]
[解决办法]
随便转转,关注一下了!
[解决办法]
应用到了一定的境界
[解决办法]
接受~
[解决办法]
vs2008 写的吧
[解决办法]
哈哈,只为接分
[解决办法]
只为学习.
哈哈.
[解决办法]
[解决办法]
收藏~~
[解决办法]
ViewState越大越好?
[解决办法]
收藏~~
[解决办法]
ViewState 我看着客户端生成的源文件里一大串东东就头大..................
[解决办法]
[解决办法]
收藏学习
[解决办法]
学习了!
[解决办法]
学习
[解决办法]
老大 你这个 通用不行吧!!!
VAR 3.0的东西吧!
现在大多数 是2.0吧`
[解决办法]
刚试验完,真的页面上没有乱七八糟的视图状态,楼主太牛了,佩服佩服!
不过有一句代码偶尔会出错;
string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;
说Pair不能强制转换为string
[解决办法]
楼主很强大...
[解决办法]
mark
jf
[解决办法]
oo
[解决办法]
这个还真没注意,学习
[解决办法]
mark
[解决办法]
有点意思。
[解决办法]
不是很明白
viewstate大了不是会影响浏览速度的嘛,记得以前在csdn哪篇文章说过不要用viewstate的.....
额....有点迷糊
[解决办法]
学习了,楼主好强大.
[解决办法]
做个标记!以后慢慢看,虽然不是很明白,但是要学习楼主的精神!
viewstate不知道为什么会弄到200k,我基本很少放大的东西,顶多一些id传送之类的!不知楼主应用什么东西
会+到200k,请教ing
www.54reader.com欢迎访问我的网站!谢谢
[解决办法]
有点意思~~
[解决办法]
ViewState?缓存?
500个用户在线,你的磁盘上就要放500*200K的空间.
500个用户每人一个ViewState的缓存?
何况你来回的序列化...
[解决办法]
我来学习的
[解决办法]
挺的~~~
[解决办法]
学习
[解决办法]
mark先
[解决办法]
不错:)
[解决办法]
[解决办法]
收藏
[解决办法]
收藏了
[解决办法]
[解决办法]
mark
[解决办法]
为了收藏。。
鼠标都滚坏了。。
[解决办法]
放进我的网摘
[解决办法]
学习。。
[解决办法]
大哥,你以前也有过几篇文章,也是给我们这些小弟灌输一些思想的,可惜我道行还太浅,不能理解你的良苦用心啊。
帮顶了。
PS:代码大部分都不懂!看来以后该好好学习了。
[解决办法]
顶,关注中。。。。。
[解决办法]
学习!!
好好的学习!!
谢谢楼主!!
[解决办法]
var? .net3.5?
[解决办法]
强
[解决办法]
不使用Session,因为它会“丢失”--是不是应该说你对Session不够了解,本身即可存入数据库,codeproject上也有存成文件的例子。
关于ViewState大家可以看看用 ASP.NET 2.0 改进的 ViewState 加快网站速度,他是怎么序列化的,算法的优化。
性能方面可参考Improving .NET Application Performance and Scalability
这个建议最好是在压力测试下用性能计数器等工具做个对比
[解决办法]
LZ教学习简单伪静态,油箱qpiwpp@qq.com ,谢谢谢谢
[解决办法]
学习下
[解决办法]
[解决办法]
路过
------解决方案--------------------
[解决办法]
up。
lz,让我学到了新的知识和新的思想。谢谢