ASP.NET 视图状态

 Web 是基于无状态的http协议,ASP.NET 为了保证控件在页面传送到服务器,再从服务器发回到页面的时保持之前的状态。

代码准备:

在aspx页面上添加一个listbox控件,和一个button服务器控件:

< asp:ListBox runat = " server "  ID = " lbViewState " ></ asp:ListBox >   
< asp:Button runat = " server "  ID = " Button1 "  Text = " Submit " />   

在后台cs文件上加上代码如下:

 

protected   void  Page_Load( object  sender, EventArgs e)   
 {   
    
if  ( ! Page.IspostBack)   
    {   
        
this .lbViewState.Items.Add( new  ListItem( " 1 " ));   
        
this .lbViewState.Items.Add( new  ListItem( " 2 " ));   
        
this .lbViewState.Items.Add( new  ListItem( " 3 " ));   
    }   
 } 

在第一次请求的时候给listbox自动的添加上三个项。

运行结果:

第一次运行的时候:

 

当点击按钮submit时候:

 

两次结果一样,这是因为在视图状态保存了请求之前listbox的内容。

如果把控件的试图状态取消,也就是告诉ASP.NET不要为此控件保存试图状态,那么就在定义控件的时候添加属性EnableViewState,并设置为false。即:EnableViewState="false"。

< asp:ListBox runat = " server "  ID = " lbViewState "  EnableViewState = " false " ></ asp:ListBox >   
< asp:Button runat = " server "  ID = " Button1 "  Text = " Submit " />   

运行结果:

当第一次请求的时候:

 

点击submint按钮的时候:

 

把listbox设置为空了,也就是listbox没有试图状态保存它之前的值。

原理:

       ASP.NET是通过在页面上新添加一个隐藏字段名称为:_VIEWSTATE的隐藏字段来保存控件的值。我们可以通过查看页面的源代码得到,但是里面的值是被服务器转换为表面没有意义的base64编码。一般.net框架会把值转化为二进制序列,然后用base64编码这些二进制序列把值传送到客户端。

      如果页面回传给服务器,服务器首先会解码这些值,然后可以做服务器端的编程。把后台的结果重新做处理后发回到客户端,保存这次的状态。

设置:

      一般如果要把某个控件的试图状态取消,即把控件EnableViewState的属性设置为false即可

     <form enableViewstate="false">即把整个form里面的控件都设置不保存试图状态。

     或者把整个页面都取消:<%@ Page ...... EnableViewState="false" %>

性能:

      一般ViewState不会影响性能,不过如果碰到大容量的数据,例如gridview的时候跟不用viewstate的时候有差别,因为在隐藏字段所要保存的值会变得很大,就会在回传的时候把整个页面的大小变大,影响速度。用户是手机,那就更有问题。

     所以当gridview等没有回传都会重新设置控件值的,可以把enableviewstate值这是为false,不维护该控件的状态。-------这句话不太明白,请大家帮忙解释一下。谢谢

安全性:

      ViewState字段是通过base64位编码的,没有进行加密,通过明文的方式传输,比较容易反编码成二进制,不过把二进制转化成相应的值,如果涉及到账号,密码等,会存在安全隐患。这时有一个方法就是可以对viewstate字段进行加密:

       把页面EnableViewStateMAC值设置成true,如下面代码:

 

<% @ Page Language = " C# "  AutoEventWireup = " true "   CodeFile = " Default.aspx.cs "  Inherits = " Index "  EnableViewStateMac = " true " %>   

这样就可以对viewstate字段进行校验,看viewstate字段是否在客户端被篡改。.net框架是在viewstate中追加一个散列码,不过该散列码有160位,所以对性能有比较大的影响。当然在config文件里面还可以设置md5算法来对viewstate进行校验。

如果要加密,可以通过des方法,有兴趣的可以查其他资料。

其他:

       这里使用viewstate不包括硬编码的控件值,例如:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<asp:ListBox runat="server" ID="lbViewState" EnableViewState="true">  
      
<asp:ListItem Value="1"></asp:ListItem>  
      
<asp:ListItem Value="2"></asp:ListItem>  
      
<asp:ListItem Value="3"></asp:ListItem>  
</asp:ListBox>  

对于这种硬编码的方式,不管enableviewstate是否为false,都讲会保存原来的值。

还有一个例外就是textbox,这种类型的控件不管是否这是为false,都会保存试图状态。

 

上面这段文章转载自:http://blog.csdn.net/liucs1985/archive/2009/07/18/4358879.aspx

 

 

设置页面是否保留视图状态的方法:

1. <%@ Page EnableViewState="false" %>

2. protected void Page_Load(object sender, EventArgs e) 
   { 
      Page.EnableViewState = false;
   }
设置控件的视图状态的方法:  
<asp:GridView ID="GridView1" runat="server" EnableViewState="false">
</asp:GridView>
 
在配置文件中设置是否保留视图状态:
在配置文件Web.config的System.web节点下,修改Pages元素的EnableViewState属性来控制所有页面是否启用视图状态信息  
<system.web>
        <!--   -->
        <pages enableViewState="false"></pages>
</system.web>
 
当用户访问某个站点时,如果隐藏字段中的数据量过大,某些代理或防火墙将禁止访问包含这些数据的页,为了解决这一问题,我们开发站点时,考虑对视图状态进行分块,需要在Web.Config文件中添加如下代码: 
<system.web>
        <!--    -->
     <pages enableViewState="true" maxPageStateFieldLength="100"></pages>
</system.web>

 

转载于:https://www.cnblogs.com/yangruipretty/archive/2009/11/14/1602954.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值