Web 是基于无状态的http协议,ASP.NET 为了保证控件在页面传送到服务器,再从服务器发回到页面的时保持之前的状态。
代码准备:
在aspx页面上添加一个listbox控件,和一个button服务器控件:
<asp:Button runat="server" ID="Button1" Text="Submit"/>
在后台cs文件上加上代码如下:
{
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: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,如下面代码:
这样就可以对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" %>