首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 没有问题,散分贴:如果你必须开发交互式页面,ViewState越大可能意味着越有本事 [已结贴,结贴人:sp1234]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-30 22:41:04 楼主
    如果你有一个非常酷的页面,页面上很多东西自动地响应用户操作而展现丰富的变化,你的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实在是太小太小了。

    如果你使用了它有效提高了复杂交互页面的效率,可以说一下提高了多少?!如果你觉得没用,也可以说一下在什么情况下没用。
    300  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-30 22:43:581楼 得分:0
    其实这是我3、4年前的asp.net1.1代码的翻版。有些asp.net编程“原则”,不是像入门书上写的那样设计的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-30 22:52:482楼 得分:0
    由于一直可以运行,其实那句应该写为:

            var fn = this.Server.MapPath(@"~/App_Data/ViewState/" + viewStateID);

    我都一直懒得改了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • npch
    • 等级:
    发表于:2008-05-30 22:53:153楼 得分:2
    代码有点难,我是一位刚学的新手,不过,这样的代码可能很有用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • npch
    • 等级:
    发表于:2008-05-30 22:54:504楼 得分:0
    请问:ViewState是存在服务器不是在客户端?  谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-30 23:02:555楼 得分:2
    深奥,看不懂
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-30 23:09:436楼 得分:0
    不用看懂。只有两个简单方法,贴到自己的页面中就行。对所有使用到ViewState的页面都需要。或者你可以放在父类中。

    可能需要自己添加命名空间:

    using System.IO;
    using System.Threading;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-30 23:11:427楼 得分:0
    我只是想让各位一定要明白,ViewState不够200K,就要把页面再设计得酷一些,ViewState大一些是好事!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-30 23:19:088楼 得分:2
    放进我的网摘
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-30 23:21:039楼 得分:2
    我也看不懂啊!
    呵呵!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • silwol
    • 等级:
    发表于:2008-05-30 23:23:2810楼 得分:2
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-30 23:24:2511楼 得分:2
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-30 23:35:5312楼 得分:0
    ThreadPool.QueueUserWorkItem(obj => File.WriteAllText(fn, value));

    这一句也不是很必要。写为:

      File.WriteAllText(fn, value));

    就可以了。当时也是为了玩玩,今天才又想起来还有这个没改。

    其实我太细抠个别语句的“效率”,除非到了必要的时候。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-30 23:36:3413楼 得分:2
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-30 23:37:3114楼 得分:0
    哦,哈哈,罪过罪过,少了一个“不”字,意思全变了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-30 23:38:1415楼 得分:2
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 09:04:1116楼 得分:0
    该回复于2008-06-02 10:42:16被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 09:24:2917楼 得分:2
    我见书上说ViewState大了影响通信量,尤其是当数据很大时候,不知道我的理解有没有错(有的书上说可以禁用不必要的ViewState)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 09:25:4318楼 得分:2
    个人认为不可取,只能适合一些小型应用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ysn1314
    • 等级:
    发表于:2008-05-31 09:26:0719楼 得分:2
    收藏~3Q
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 09:29:0720楼 得分:2
    做个记号 加入搜藏,呵呵。接分。。!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 09:31:3821楼 得分:2
    放进我的网摘
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 09:36:1022楼 得分:2
    记号~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 09:40:4123楼 得分:2
    學習
    加強
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 09:48:3624楼 得分:2
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 09:55:5625楼 得分:2
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 09:58:1226楼 得分:2
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hackztx
    • 等级:
    发表于:2008-05-31 10:06:5227楼 得分:2
      var viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;???

    var也出来了?

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hackztx
    • 等级:
    发表于:2008-05-31 10:08:1128楼 得分:0
    自己定义的一个类型?

    object?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 10:14:2229楼 得分:2
    引用 19 楼 ysn1314 的回复:
    收藏~3Q
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 10:14:5630楼 得分:2
    随便转转,关注一下了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 10:15:2231楼 得分:0
    既然来了,久接格分吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 10:33:1132楼 得分:2
    应用到了一定的境界
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 10:46:5033楼 得分:2
    接受~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-31 11:16:3834楼 得分:2
    vs2008 写的吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hy_lihuan
    • 等级:
    发表于:2008-05-31 11:38:0635楼 得分:2
    哈哈,只为接分
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • <