Session,ViewState用法详细说明
数据类型:
但viewstate并不是能存储所有的.net类型数据,它仅仅支持string、integer、boolean、array、arraylist、hashtable 以及自定义的一些类型.
其他考虑
当然,任何事物都有两面性, 使用viewstate会增加页面html的输出量,占用更都的带宽,这一点是需要我们慎重考虑的. 另外, 由于所有的viewstate都是存储在一个隐藏域里面,用户可以很容易的通过查看源码来看到这个经过base64编码的值.然后再经过转换就可以获取你存储其中的对象和变量值.
其实,对于viewstate的安全性问题,asp教程.net还给我们提供了更多的选择.一般如果要保护viewstate有两种方式: 一种是防篡改,一种是加密. 一说到防篡改,我们就想起了使用散列代码. 没错, 我们可以在页面顶部加入如下代码:page enableviewstatemac=true。这样asp.net教程就会自动的在viewstate中追加一个散列码,在页面回传时,服务器根据回传的viewstate生成一个散列码,再与回传的散列码相比较,如果不对,则丢弃该viewstate,同时控件将恢复初试状态. (默认情况下asp.net是通过sha1算法而不是md5算法来生成散列,不过这个可以在machine.config里面配置machinekey validation="md5"即可),而viewstate加密就更简单了, 只要在machine.config里设置一下machinekey validation="3des"即可实现用des加密viewstate了.
使用方法
怎么在客户端,存取viewstate?
应用环境
一些与安全性无关,数据量较小,需要长时间操作的参数,应该用viewstate存取。
在webgis中,地图的各种相关状态,如zoom, center, layers, visibility等,用viewstate存取的话,就不存在session过期的问题,网页可以永远使用,甚至可以下载保存,在进行地图请求,或iframe到第三方的应用中。
asp.net中的viewstate用法
昨天看到一个文章,作者在自己的页面中定义了几个全局变量,类型是static,但是这样的定义会存在问题,当一个用户访问的时候不会有问题,但是当大量用户并发访问系统的时候,页面中的这些static类型的全局变量就会出现问题了,然后作者改用了session变量保存以前由static类型全局变量纪录的数据,因为session是状态量,只是和某个访问进程相关,这样就不会出现由于static类型引起的问题了。
但是这样的话系统中的session就太多了,我总认为这样不太好,虽然每个一个session都有一个id不会冲突。asp.net引入了viewstate,可以记录同一个页面的不同postback中的一些数据值。
所以我的解决方法是:使用例如viewstate["name"]这样的形式记录以前static的全局变量,这样就可以避免这个问题了,因为我的系统是在局域网使用的,viewstate带来的多余的数据量可以忽略不计了。
asp.net viewstate用法:
asp.net中的viewstate是asp.net中用来保存web控件回传时状态值一种机制.在web窗体(form)的设置为runat="server",这个窗体(form)会被附加一个隐藏的属性_viewstate._viewstate中存放了所有控件在viewstate中的状态值.
viewstate是类control中的一个域,其他所有控件通过继承control来获得了viewstate功能.它的类型是system.web.ui.statebag,一个名称/值的对象集合.
当请求某个页面时,asp.net把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端.当客户端把页面回传时,asp.net分析回传的窗体属性,并赋给控件对应的值.当然这些全部是由asp.net负责的.
定义viewstate属性
public int pagecount
{
get{return(int)viewstate["pagecount"];}
set{viewstate["pagecount"]=value;}
}
使用viewstate的条件
如果要使用viewstate,则在aspx页面中必须有一个服务器端窗体标记(<formrunat=server>).窗体字段是必需的,这样包含viewstate信息的隐藏字段才能回传给服务器.而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,asp.net页面框架才能添加隐藏的字段.
page的enableviewstate属性值为true.
控件的enableviewstate属性值为true.
提醒:
1.当存在页面回传时,不需要维持控件的值就要把viewstate禁止.
2.viewstate的索引是大小写敏感的.
3.viewstate不是跨页面的.
4.为了能包存在viewstate中,对象必须是可流化或者定义了typeconverter.
5.控件textbox的textmode属性设置为password时,它的状态将不会被保存在viewstate中,这应该是出于安全性的考虑.
6.在页面没有回传或重定向或在回传中转到(transfer)其他页面时不要使用viewstate.
7.在动态建立控件时要小心它的viewstate.
8.当禁止一个程序的viewstate时,这个程序的所有页面的viewstate也被禁止了.
9.只有当页面回传自身时viewstate才是持续的.
设置viewstate
viewstate可以在控件,页,程序,全局配置中设置.缺省情况下enableviewstate为true.如果要禁止所有页面viewstate功能,可以在程序配置中把enableviewstate设为false.
补充:asp.net教程,基础入门