天高地厚

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ASP.NET中正确使用ViewState

Posted on 2013-01-26 22:23  天高地厚-GNU  阅读(588)  评论(0编辑  收藏  举报

ASP.NET有了ViewState变得异常强大,同时,也为人"诟病"。

往往你能在很多入门的书籍中看到:请谨慎或者禁用ViewState 这样的字眼

它会让你的站点和用户交互起来很好很强大,也会增加页面的体积,让你的带宽资源变得很差很窘迫。

真的是鱼和熊掌不可兼得?未必。

我们拿一个实例来分析,找到解决问题的思路,而不是一刀切的思维模式。

------------------------

【空间换时间】

我们新建一个网站,使用默认的Default.aspx页面,给它拖拽一个GridView控件,然后显示几条数据看看。

很简单是吧,看看它的体积有多大:

它也生成了一堆体积庞大的ViewState:

在实际工程中,这么大容量的页面体积,难免会导致网络传输过程中有点缓慢。

----------------------------

恩,其实这个ViewState有三种保存形式:

一个是上面图中的【也是默认的】,推送到客户端浏览器;

一个是保存在服务器内存里【cache】;

一个是保存在服务器硬盘中。

这三种方式,我们选择哪个?

个人建议,保存在服务器硬盘中;

因为,如果存储在内存里,不能确保它的稳定性,消失了怎么办?

---------------------------------

同样的页面,我们保存到服务器硬盘中,是否有所改观呢?

先不贴代码,先看看疗效。

【ViewState存储到硬盘之后】

一眼看上去,页面代码整洁多了,以前体积庞大的字符串现在成了一行有ID的标示。



那页面体积呢?



体积缩小了接近50%,那么,既然我们没有禁用ViewState,那我们的视图状态哪里去了?

我把它保存在服务器磁盘中了。

这样,既不影响用户体验,又减少了页面体积,页面加载的速度自然就提升了。

【当然,视图状态为了安全,可以加密,这在本文末端有详细的代码示例】

---------------------------

该演示一下代码了,先在网站下创建一个文件夹存储视图状态的文件:

然后,添加一个类,来保存视图状态【红线部分自己多注意】:

然后,如果有那个页面想缩小体,就修改页面的基类,让页面从我们的这个管理类中派生:

就这么简单,怎么样,心动了吧?

快去动手试试吧!

----------------------------------

当然,如果你的服务器带宽资源很出色,就不一定不需要我的方法来降低网络负载。

有可能你需要另外一个方法:

ViewState加密【保护好你的视图状态】

如果你给视图状态加密了,那加密和解密之间,要耗费一定的性能。

话说,上次看美国国防部的网站,视图状态就加密了。。。

人家不缺$$,肯定不会在乎加密解密的性能了。。。