当web窗体控件设置为runat='server '时,此控件将附加一个隐藏属性_ViewState,该属性存储ViewState中所有控件的状态值。ViewState是具有名称/值的对象的集合。当请求页面时,ASP.NET将所有控件的状态序列化为字符串,然后将其作为表单的隐藏属性发送给客户端。当客户端发回页面时,ASP.NET分析返回的表单属性,并将相应的值分配给控件。
当我们编写ASP.NET表单时,一旦表单runat=server被标记,ASP。NET将在输出时自动向页面添加一个隐藏字段。
input=' hidden ' name=' _ _ view state ' value=' '然后,使用此隐藏字段,页面中所有其他控件的状态,包括页面本身的某些状态,都将保存在此控件值中。每次提交页面时,它都会被提交到后台,ASP.NET会对这些值进行解码。然后在输出时根据这个值恢复每个控件的状态。我们再来看看这个控件的value值,可能类似于下面的形式:Oz4 O2w8aTwxPjs O2w8.很多人会认为这是加密信息,其实不然。ms仅将每个控件和页面的状态存储到适当的对象中,然后序列化该对象,最后再次执行base64编码,并直接将其分配给viewstate控件。
一、视图状态的原理。
1.浏览器请求缺省. aspx页面。
2.当在服务器端找到创建的ViewState时,将自动创建一个名为__VIEWSTATE(双下行链接全部大写)的隐藏字段,隐藏字段的值将被base64加密后返回到浏览器端。这个加密过程在页面生命周期的SaveAllState事件中的SaveAllState方法中完成。
3.当浏览器提交表单时,__VIEWSTATE的隐藏字段也会提交给服务器。此时,页面生命周期的ReadState事件的ReadAllState方法将根据base64解密加密值,并最终将该值分配给名为name的ViewState。
4.最后,操作视图状态中的值。
二、视图状态的用法:
1.定义视图状态属性。
public int page count { get { return(int)ViewState[' page count '];}设置{ ViewState[' page count ']=值;}}2.使用视图状态的条件。
要使用视图状态,在ASPX页面中必须有一个服务器端表单标记(表单运行时间=“服务器”)。表单字段是必需的,以便包含视图状态信息的隐藏字段可以返回到服务器。此外,表单还必须是服务器端表单,以便在服务器上执行页面时,ASP.net页面框架可以添加隐藏字段。
页面的EnableViewState属性值为真。控件的EnableViewState属性值为真。
3.什么3。ViewState需要注意。
A.当出现页面回发时,有必要在不维护控件值的情况下禁止ViewState。视图状态的索引区分大小写。视图状态不是跨页的。为了保存在视图状态中,对象必须是可流式的或者定义了类型转换器。e .当TextBox的TextMode属性设置为Password时,其状态不会保存在ViewState中,这应该是出于安全考虑。f .当页面没有被返回或重定向或在返回中转移到其他页面时,不要使用ViewState。动态创建控件时,注意它的视图状态。h .当程序的视图状态被禁止时,程序所有页面的视图状态也被禁止。I. ViewState只有在页面自己发布时才是持久的。
4.设置视图状态。
视图状态可以在控件、页面、程序和全局配置中设置。默认情况下,EnableViewState为真。如果要禁用所有页面视图状态功能,可以在程序配置中将EnableViewState设置为false。
第三,生成的__VIEWSTATE如图所示。
使用视图状态查看器2(视图状态查看器)查看该值。
因此,ViewState的安全性还是比较差的,建议不要存储机密敏感信息。虽然ViewState可以加密,但由于ViewState需要存储在客户端,因此存在固有的安全风险。
四.视图状态和会话之间的比较。
(1)会话值存储在服务器的内存中,因此使用大量会话肯定会增加服务器的负担。由于viewstate只将数据存储在页面隐藏控件中,因此不会再占用服务器的资源,所以我们可以在viewstate中保存一些服务器需要‘记住’的变量和对象。sesson应该只应用于需要跨页并且与每个访问用户相关的变量和对象的存储。
(2)默认情况下,会话将在20分钟后到期,而viewstate永远不会到期。
但是,viewstate不能存储所有的。net类型数据,但只支持String、Integer、Boolean、Array、ArrayList、Hashtable和一些用户自定义类型。
任何事情都有两面性,使用viewstate会增加页面html的输出,占用更多的带宽,需要我们慎重考虑。此外,由于所有视图状态都存储在一个隐藏的域中,用户可以通过查看源代码轻松地看到这个base64编码的值,然后在转换后获得存储在其中的对象和变量值。