Session,ViewState用法

Session,ViewState用法
基本理论:

session值是保存在服务器内存上,那么,可以肯定,大量的使用session将导致服务器负担加重. 而viewstate由于只是将数据存入到页面隐藏控件里,不再占用服务器资源,因此, 我们可以将一些需要服务器"记住"的变量和对象保存到viewstate里面. 而sesson则只应该应用在需要跨页面且与每个访问用户相关的变量和对象存储上. 另外,session在默认情况下20分钟就过期,而viewstate则永远不会过期. 

数据类型:

但viewstate并不是能存储所有的.net类型数据,它仅仅支持String、Integer、Boolean、Array、ArrayList、Hashtable 以及自定义的一些类型.

其他考虑

当然,任何事物都有两面性, 使用viewstate会增加页面html的输出量,占用更都的带宽,这一点是需要我们慎重考虑的. 另外,由于所有的viewstate都是存储在一个隐藏域里面,用户可以很容易的通过查看源码来看到这个经过base64编码的值.然后再经过转换就可以获取你存储其中的对象和变量值.

ViewState加密

其实,对于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中用来保存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


EnableViewState禁用与注意事项

textbox,如果你只需要取他的text里面的值,而不是要他响应什么事件,那他的viewstate是可以禁用的.


linkbutton 和asp:button还有别的按纽,如果你只需要他响应单击事件,那他的viewstate可以禁用.


hyperlink,一般情况下不建议用他.他的功能和<a href基本上一样,如无特殊需要尽量不要用他.他的值如果是需要后台动态添加进去的话,viewstate值不能禁用,否则在执行其它事件后他的值又不 能显示,如果在前台就可以直接确定他的值,那他的viewstate是可以禁用的,但无论他的值是需要前台就可以确定还是需要后台填充进去,<a href一样都能完成的.所以一般情况下不需要使用他

所有验证控件,只要不需要在后台对他再进行编辑,都可以禁用viewstate,包括自定义验证控件都可以禁用

dropdownlist,listbox还有checkboxlist这一类的都差不多,如果是前台就能确定他的选项值,那他的 viewstate可以禁用,不影响他的取值,但如果他的值是需要后台来梆定,又是需要在!ISPostBack里绑定的话,那他的viewstate值 是不能禁用的,否则一执行其它事件以后,他的值就不存在了.

其实最占用资源的就是datagrid,repeater,datalist等这些控件.
datagrid里面数据量庞大.但他的viewstate值在翻页,编辑等操作时起到很大的作用,所以datagrid的viewstate值不能完全禁用.

我们这里以datagrid为例介绍一个如何禁用一批viewstate来优化速度
datagrid 里<asp:BoundColumn>.他在浏览时是个Label,编辑时他是一个textbox.而label和textbox都是带有 viewstate.比如是一个5列20行的datagrid,当他数据填充以后他就含有100个viewstate的值,这是一个庞大的数据..如果不 想办法禁用是很占用资源的.<asp:BoundColumn>方法虽然方便,但尽量大家不要使用,用如下方法代替
<asp:TemplateColumn>
             <ItemTemplate>
<div align=center><%# DataBinder.Eval(Container,"DataItem.id") %></div>   //不要使用任何控件,一样能显示,而且不占用资源
             </ItemTemplate>
<EditItemTemplate>
              <asp:TextBox ID="Textbox2" Text=''<%# DataBinder.Eval(Container,"DataItem.listid")%>'' Runat="server" EnableViewState=False Columns="自己赋值">
              </asp:TextBox>
             </EditItemTemplate>            </asp:TemplateColumn>
datagrid里的项,viewstate能禁用的尽量禁用,太占资源了

禁用ViewState的方式:
• 页面整体禁用ViewState:在顶部Page中EnableViewState="False"
• 指定控件禁用ViewState,在控件上EnableViewState="False"

页面禁用ViewState以后并没有完全去掉ViewState,只要ViewState不是很大就可以了。如果要求一点儿ViewState都不能有,那么则页面中不能有runat=server的form,如果页面中没有表单元素,把form完全去掉就可以。如果Button等服务端控件没有放到runat=server的form中,那么则是不可用的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值