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不包括硬编码的控件值,例如:

 

Code

对于这种硬编码的方式,不管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>

 

posted @ 2009-11-14 11:58  yang rui  阅读(714)  评论(2编辑  收藏  举报