文章教程

6.2ViewState视图状态

8/31/2020 9:37:14 PM 人评论 次浏览

6.2 ViewState视图状态

在状态管理中不只是通过服务器保存状态,也可以通过客户端保存状态。在Framework平台中向服务器请求数据,服务器生成页面的同时将为自动生成一些数据,这些数据保存一些交互的数据,如提交的文本框的值等。在服务器生成的页面中,都会产生一个区域。

alt

这个区域存储客户端加密的数据和状态数据,这些数据是通过服务器自动加密产生的,这个区域的数据被称为视图状态。

6.2.1 视图状态原理

在客户向ASP.NET开发的网站提交请求时,服务器向客户端发送请求数据的同时,也将在生成的页面中自动产生一些数据,这些数据通过特殊的编码格式,将服务端产生的数据按照一定的加密方式保存在客户端页面的一个隐藏区域内部,这个区域称之为视图状态区域。视图状态区域可以由状态属性来设置,可以设置为false或true,默认为true,也就是说,在页面开发时程序人员如果不设置状态属性,则系统将默认存储视图状态。通过代码可以看到视图状态的使用情况,代码如下。

alt

上面的代码显示,在客户请求后,返回的数据中系统自动产生了一个隐藏域,名称为VIEWSTATE,这个隐藏域就是保持视图状态的位置。现在演示视图状态是否存储。在没有设置视图状态时,采用默认的方式代码如下。

alt

上面的代码执行后,将在文本框中显示当前的时间,在没有设置视图状态时,单击按钮提交新数据的同时,系统将自动保存原来的视图状态,执行结果如图6-1所示。

alt

图6-1 视图状态没有设置

重新设置视图状态为false观察执行结果EnableViewState="false",如图6-2所示。

alt

图6-2 设置了视图状态为false后的执行结果

通过上面的对比可以看出,在设置了视图状态前后,被保存在客户端的数据是不同的,一些控件在没有保存视图状态时,不能正常显示数据。视图状态不只能存储数据,也能存储对象。

6.2.2 在视图状态中存储对象

视图状态是可以存储对象的,但是对于可存储的对象是有要求的。所有能够被存储在视图状态中的对象必须是能够被序列号的对象。自定义的对象也必须实现或声明为可序列号的对象,才能存储在视图状态中,因为视图状态中存储的数据全部是以键值对的方式存储的,不能够被序列号的对象将不能以此种方式存储。下面通过代码实现视图状态中的对象存储。首先建立一个可序列化的学生类,代码如下。

alt

然后在程序中初始化并且将学生类的对象放入视图状态中,代码如下。

alt

代码执行效果如图6-3所示。

alt

图6-3 视图状态存储对象

首先在窗体的加载事件中,将对象存储在视图状态中,然后单击按钮将对象从视图状态中取出,还原为原来的对象,将对象的属性输出到界面上。

6.2.3 视图状态的安全

在视图状态中存储大量的数据,包括控件中的值和序列化的对象等信息,虽然视图状态是经过加密处理过的,但这么明显的信息最容易被发现和破解。所有在视图状态中存储的信息是不能有关键信息的,如数据库的地址、端口号、用户的名称密码等敏感信息。下面是视图状态在页面中产生的信息,通过其他途径的解码获得的数据。代码如下。

alt

产生的信息如下。

alt

通过解码程序观察具体解密后获得的信息如图6-4所示。

alt

图6-4 软件解析的视图状态

由于视图状态是将信息放在页面中的,视图状态是一个理想的存储非关键信息的空间,使用起来也非常方便,但这样的方法也有很多缺点,比如,传递给另外的页面,或者验证用户是否在线等,这样的信息验证,需要另外的方法实现。

教程类别