zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    shell eval命令
    嘟嘟嘟
    07 linkextractor的基本用法
    rabbitmq消息队列
    5. 哨兵集群
    4.主从同步
    3. redis持久化存储
    2. redis 安全
    1.redis基础
    06. scrapy的Request对象
  • 原文地址:https://www.cnblogs.com/yangruipretty/p/1602954.html
Copyright © 2011-2022 走看看