ViewState的使用与配置

来源:互联网 发布:Linux安装telnet yum 编辑:程序博客网 时间:2024/06/03 19:53


ViewState就是页面中的名字叫做__VIEWSTATE的隐藏控件,它使我们页面体积膨胀,不利于页面的seo优化;页面返送间都要携带更多的大量的数据,耗费更多的流量、延长响应时间。


一个页面生命周期大约可分为为:页请求、开始、初始化、加载、验证、回发事件处理、呈现、卸载这几个阶段。


 OnInit 和 OnInitComplete方法之间有一个TrackViewSate的方法,它开启对视图状态更改的跟踪。也就是说,从这里开始,你才能使用viewstate(否则这些数据将不会被发送回页面),页面开始建立所有控件状态的一个快照。


加载阶段OnPreLoad之前的LoadViewState方法,如果页面是回发的,他就会使用页面回发的viewstate,利用它记录的信息改变对应控件的属性,让你页面原状态复活。


如何禁用viewstate,这个简单,就是在web.config或页面上加一个EnableViewState设为false即可。

     有点注意的是,你如果要只对页面的某个控件禁用viewstate,你可以对页面开启EnableViewState而只对这个控件设置EnableViewState禁用就OK了;

     但是如果你只对某个控件使用viewstate,对页面EnableViewState禁用和控件EnableViewState开启是达不到效果的。

     因为页面的EnableViewState=”false”会强制的把整个页面及其控件的禁用。

     想要达到这种效果,我们需要用到另一个ViewStateMode的属性,我们要对页面设置EnableViewState=”true”,然后通过ViewStateMode=“Disabled”来禁用页面的viewstate,而控件默认的ViewStateMode=“Inherit”,我们再去设置需要启用viewstate控件的ViewStateMode=“Enabled”来只启用某个控件使用viewstate。


首先一点是我们可以在web.config中设置pages的maxPageStateFieldLength来设置单个viewstate的最大值,以防止一些代理、防火墙或移动浏览器因为一个隐藏字段体积过大而阻止页面。

 

     其次再说的,我们页面中看到的viewstate字符串,其实是没有加密的,只是经过了Base64的编码,我们可以很easy的逆向出来看到原始的数据。不过还好的是,asp.net默认启用了一个基于散列码来保证viewstate不被修改:asp.net会根据消息验证代码 (MAC) 密钥去计算viewstate,得到一个散列码,然后把这个码添加到viewstate中,保存到页面的隐藏字段中;如果页面回发时,再次计算散列码与之前的比较,如果不匹配就拒绝接受此次回发。

     默认情况下,这个散列的密钥是根据计算机的MAC地址计算的,如果在web场中,就可能会不能验证viewstate。这种环境下,我们可以通过EnableViewStateMac=”false”来禁用校验;另一种方法就是在多台服务器间配置同样的自己生成的密钥,然后分布在不同的计算机的machine.config中配置。

 

     即使这样,我们viewstate还是很容易别人看到,如果不想这样,我们可以用ViewStateEncryptionMode来加密viewstate,它有三个值:Always,总是加密;Never,从不加密;Auto,仅在需要时加密,在呈现Html之前显式调用Page.RegisterRequiresViewStateEncryption()来启用加密,否则不加密。




0 0
原创粉丝点击