没有问题,散分贴:如果你必须开发交互式页面,ViewState越大可能意味着越有本事

以专业开发人员为伍 2008-05-30 10:41:04
加精
如果你有一个非常酷的页面,页面上很多东西自动地响应用户操作而展现丰富的变化,你的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);
}


不使用Session,因为它会“丢失”。ViewState保存在磁盘上,即使服务器重新启动,也不会丢失页面状态。

下面这段可以放在Global.asax中,也可以根本不管:


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实在是太小太小了。

如果你使用了它有效提高了复杂交互页面的效率,可以说一下提高了多少?!如果你觉得没用,也可以说一下在什么情况下没用。
...全文
14324 444 打赏 收藏 转发到动态 举报
写回复
用AI写文章
444 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ab.阿布 2012-08-06
  • 打赏
  • 举报
回复
看不懂,还在学习中!
Csharp_琪 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 454 楼 的回复:]

楼主给我1分,我下东西。急啊
[/Quote]
下东西用的不是这个分啊,伙计!
zhenjun_qi 2012-07-28
  • 打赏
  • 举报
回复
楼主给我1分,我下东西。急啊
UFO_O 2012-07-11
  • 打赏
  • 举报
回复
佩服lz ! 老鸟 级 人物哇
w87875251l 2012-05-22
  • 打赏
  • 举报
回复
收藏了。。。。。。。。
evget2012 2012-05-09
  • 打赏
  • 举报
回复
DevExpress系列精品课程: DXperience ASP.NET Subscription远程网络培训于5月23日开课 【参考链接】DevExpress中文官网:www.devexpresscn.com 【垂询电话】400-700-1020
cm_boy 2012-04-28
  • 打赏
  • 举报
回复
sp1234,求加你的QQ号。
thinclient 2012-04-14
  • 打赏
  • 举报
回复
标记下,以后也许有用
汴蓝 2012-04-02
  • 打赏
  • 举报
回复
前辈,你好,我想请教你一个问题,我如何把LoadPageStateFromPersistenceMedium()、SavePageStateToPersistenceMedium(object state)这两个方法移到一个类里面去,然后在页面直接里直接调用该类的方法就是了。因为现在我把它们放在类里面“base.方法”、“Cache.方法”会报错,望前辈能够给与解答。谢谢
bakdfkuk 2012-03-16
  • 打赏
  • 举报
回复
有时间的时候好好看了一下代码,上面的言论纯个人误解,不好意思!
bakdfkuk 2012-03-15
  • 打赏
  • 举报
回复
以前用过类似的一些方法,只是页面干净了,但是存在一个问题就是在viewstate这个文件夹下会存在好多好多的文件,尤其是运行时间长了以后,楼主这个我看代码,没太看懂,不过看用file来写,是不是也会造成太多的文件呢,那样要隔一段时间就要去文件夹中删除一下,很费劲,
sky_pearl 2012-03-12
  • 打赏
  • 举报
回复
前来关注。。学习
jlwfl 2012-02-26
  • 打赏
  • 举报
回复
这个真是纯粹的技术贴。强烈的支持!!!!!!
new_fengzi 2011-12-29
  • 打赏
  • 举报
回复
麦瑞克
ya0000 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 65 楼 diablososi 的回复:]

刚试验完,真的页面上没有乱七八糟的视图状态,楼主太牛了,佩服佩服!
不过有一句代码偶尔会出错;
string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;
[/Quote]


你是怎么添加的?我的添加上怎么没有实现?
yeye518 2011-11-29
  • 打赏
  • 举报
回复
现在前端界面的酷帅,完全可以通过 jquery EXTJS,等前端技术来搞定,不一定非得把ViewState搞的那么大
jianhenjh 2011-11-20
  • 打赏
  • 举报
回复
00000000000000000
wquanchao 2011-11-04
  • 打赏
  • 举报
回复
哈哈,我最喜欢用ViewState啦,虽然有时候处理的不够好,但页面的交互能力大大地提高了
fashionmetxt 2011-11-02
  • 打赏
  • 举报
回复
真的很有用,顶一下,不算挖坟吧``
yunwuxin009 2011-11-01
  • 打赏
  • 举报
回复
学习一下
加载更多回复(424)

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧