在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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不包括硬编码的控件值,例如:
对于这种硬编码的方式,不管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)
{
}
设置控件的视图状态的方法:
<asp:GridView ID="GridView1" runat="server" EnableViewState="false">
</asp:GridView>
在配置文件中设置是否保留视图状态:
在配置文件Web.config的System.web节点下,修改Pages元素的EnableViewState属性来控制所有页面是否启用视图状态信息
<system.web>
</system.web>
当用户访问某个站点时,如果隐藏字段中的数据量过大,某些代理或防火墙将禁止访问包含这些数据的页,为了解决这一问题,我们开发站点时,考虑对视图状态进行分块,需要在Web.Config文件中添加如下代码:
<system.web>
</system.web>
|
请发表评论