本文介绍了视图状态在ASP.NET中的使用,包括原理、用法以及与会话的比较。让我们来看看那些对viewstate的用法感兴趣的人。
当web窗体控件设置为runat='server '时,此控件将附加一个隐藏的attribute _ViewState,它将所有控件的状态值存储在ViewState中。视图状态是带有名称/值的对象的集合。当页面被请求时,ASP.NET会将所有控件的状态序列化为一个字符串,然后作为表单的隐藏属性发送给客户端。当客户端回发页面时,ASP.NET分析返回的表单属性,并将相应的值赋给控件。
当我们编写一个ASP.NET表单时,一旦表单runat=server被标记,ASP。NET会在输出时自动在页面上添加一个隐藏字段。
输入类型=' hidden ' name=' _ _ VIEWSTATE ' value=' '
然后,使用这个隐藏字段,页面中所有其他控件的状态,包括页面本身的一些状态,都将保存到这个控件值中。页面每次提交都会提交到后台,ASP.NET会对值进行解码,然后输出时根据这个值还原每个控件的状态。我们来看看这个控件的价值。可能类似于以下形式:Oz4 O2w8aTwxPjs O2w8.很多人会以为这是加密信息,其实不是。ms只是将每个控件和页面的状态存储到一个合适的对象中,然后将对象序列化,最后再次进行base64编码,直接赋给viewstate控件。
一、ViewState的原理
1.浏览器请求Default.aspx页。
2.当在服务器端找到创建的视图状态时,此时会自动创建一个名为__VIEWSTATE的隐藏域。隐藏域的值用base64加密,然后返回给浏览器端。这个加密过程是在页面生命周期的SaveState事件的SaveAllState方法中完成的。
3.当浏览器提交表单时,也会将__VIEWSTATE的隐藏域提交给服务器。此时,页面生命周期的ReadState事件的ReadAllState方法将根据base64对加密的值进行解密,并最终将该值赋给ViewState named name。
4.最后,在ViewState中操作该值。
二、ViewState的用法:
1.定义ViewState属性
公共int页面计数{
get { return(int)ViewState[' page count '];}
set { ViewState[' page count ']=value;}
}
2.使用ViewState的条件
如果要使用ViewState,在ASPX页面中必须有一个服务器端表单标记(form runat='server ')。字段是必需的,以便可以将包含视图状态信息的隐藏字段发送回服务器。此外,表单必须是服务器端表单,以便当页面在服务器上执行时,ASP.net页面框架可以添加隐藏字段。
页面的EnableViewState属性为true。
控件的EnableViewState属性为true。
3.ViewState需要注意的地方
A.当有页面回发时,有必要在不保持控件值的情况下禁止视图状态。
B.视图状态的索引区分大小写。
C.视图状态不是跨页的。
D.为了保存在ViewState中,对象必须是可流化的或者定义了TypeConverter。
E.当控件TextBox的TextMode属性设置为Password时,其状态不会保存在ViewState中,这应该是出于安全原因。
F.当页面在返回期间没有被返回或重定向或转移到其他页面时,不要使用ViewState。
G.动态生成控件时,请注意它的视图状态。
H.当一个程序的视图状态被禁止时,这个程序的所有页面的视图状态也被禁止。
I .只有当页面回发到自身时,视图状态才是持久的。
4.设置视图状态
可以在控件、页面、程序和全局配置中设置视图状态。默认情况下,EnableViewState为true。如果要禁用所有页面视图状态函数,可以在程序配置中将EnableViewState设置为false。
三、产生的 __VIEWSTATE如图
使用ViewStateDecoder2(视图状态查看器)查看这些值。
所以ViewState在安全性上还是比较差的。建议不要存储机密和敏感信息。虽然ViewState可以加密,但它有内在的安全风险,因为它必须存储在客户端。
四、viewstate与session的对比
(1)会话值存储在服务器的内存中,所以,可以肯定的是,大量的会话会增加服务器的负担。由于viewstate只将数据存储到页面隐藏控件中,不再占用服务器资源,所以我们可以将一些需要服务器‘记住’的变量和对象保存到viewstate中。sesson应该只应用于需要跨页的、与每个访问用户相关的变量和对象的存储。
(2)默认情况下,会话将在20分钟后过期,而视图状态永远不会过期。
但是,viewstate不能存储所有。net数据,它只支持String、Integer、Boolean、Array、ArrayList、Hashtable和一些自定义类型。
任何事情都有两面性。使用viewstate会增加html在页面上的输出,占用更多带宽,需要我们慎重考虑。此外,由于所有视图状态都存储在一个隐藏域中,用户可以通过查看源代码很容易地看到base64编码的值。然后,在转换之后,它们可以获得存储在其中的对象和变量值。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。