ASP.NET中的ViewState

原创 2004年07月17日 10:53:00
 ASP.NET中的ViewState<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

ViewStateASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE_VIEWSTATE中存放了所有控件在ViewState中的状态值。

ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。

当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。当然这些全部是由ASP.NET负责的,对用户来说是透明的。

使用ViewState的条件

如果要使用 ViewState,则在 ASPX 页面中必须有一个服务器端窗体标记 (<form runat=server>)。窗体字段是必需的,这样包含 ViewState 信息的隐藏字段才能回传给服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET 页面框架才能添加隐藏的字段。
Page
EnableViewState 属性值为 true
控件的 EnableViewState 属性值为 true

页面本身将 20 字节左右的信息保存在 ViewState 中,用于在回传时将 PostBack 数据和 ViewState 值分发给正确的控件。因此,即使该页面或应用程序禁用了 ViewState,仍可以在 ViewState 中看到少量的剩余字节。

设置ViewState
ViewState
可以在控件,页,程序,全局配置中设置。缺省情况下 EnableViewState true 。如果要禁止所有页面 ViewState 功能,可以在程序配置中把 EnableViewState 设为 false
在控件中:

<asp:DataGrid EnableViewState="false"%>

DataGrid1.EnableViewState = false;

在页中:

<%@ Page EnableViewState="false" %>

Page.EnableViewState = false;

在程序中:

web.config中加入 <pages enableViewState="false" />

在全局配置:

machine.config中修改 <pages enableViewState="false" />

EnableViewState
优先级别:
全局配置 < 程序 < < 控件

注意:下列服务器控件不能禁止ViewState

Textbox
Checkbox
Checkbox List
RadioButtonList

上面控件的状态通过IPostBackEventHandler IPostBackDataHandler接口处理,而不是ViewState的机制,所以EnableViewState没有效果。

ViewState对象
 在页面回传间通信,ASP中一般利用窗体的属性和 session 来存放数据,在 ASP.NET 中也可以使用 ViewState 对象来做同样的处理。
ViewState存放数据:

ViewState[key] = value;

ViewState.Add(key, value);

取出数据:

TempStr = ViewState[key];
key
不存在时返回空。

不能通过ViewState对象来访问控件的值。

动态建立控件的ViewState:
当需要动态地建立一个服务器控件,如下建立了一个 RadioButton 控件并加入到窗体控件集合中:

  RadioButton rb = new RadioButton();
Page.Controls[1].Controls.Add(pc);

上面的代码增加一个控件到控件集合末,同样也可以插入到已有控件中的任何位置。

  RadioButton rb = new RadioButton();
Page.Controls[1].Controls.AddAt(1,pc);

通常,这些动态生成的控件的状态也需要生成到 ViewState 中去,但这个功能并没有完全实现,特别是生成的控件插入到已有的控件中时。
当动态生成控件和已有控件并存时 ViewState 的结果是不可预料的。在页面回传时,首先非动态生成的控件在ASPX页中被生成,并在 Page_Init
Page_Load 事件中读取 ViewState。当页面的控件读取 ViewState 的值时,那些动态生成的控件却还没有被生成,所以当动态生成的控件被
生成时,页面就会省略掉ViewState或者以剩下或许错误的 ViewState 来填充控件。

所以,当需要插一个动态生成的控件到已有控件中去时,最好把这个控件的 ViewState 通过EnableViewState禁止掉。

提醒:
1.
当存在页面回传时,不需要维持控件的值就要把 ViewState 禁止。
2. ViewState
的索引是大小写敏感的。
3. ViewState
不是跨页面的。
4.
为了能包存在 ViewState 中,对象必须是可流化或者定义了 TypeConverter
5.
控件 TextBox TextMode 属性设置为 Password时,它的状态将不会被保存在 ViewState 中,这应该是出于安全性的考虑。
6.
在页面 没有回传 或 重定向 或 在回传中转到(transfer)其他页面 时不要使用 ViewState
7.
在动态建立控件时要小心它的 ViewState
8.
当禁止一个程序的 ViewState 时,这个程序的所有页面的 ViewState 也被禁止了。
9.
只有当页面回传自身时 ViewState 才是持续的。

ASP.NET中的viewstate使用

.net 中viewstate的原理和使用 如果在客户端和服务器段保持往返的状态,在.net中通过加入一个隐藏控件_ViewState来实现的,这些状态的保持不需要程序员来控制,节省了程序员的精力。但...
  • greyls
  • greyls
  • 2007年07月08日 10:54
  • 6173

ASP.NET 对象 ViewState的用途

来公司时间不长也不短,带我们这sa也比较重视知识的学习和分享,这次让一个同事分享了一下有关viewstate,虽然没讲出什么来,却让自己发现了自己的知识处处都是漏洞.庆幸的是发现了,那么接下来的就是补...
  • bemavery
  • bemavery
  • 2014年05月27日 22:39
  • 4190

ASP.NET:Application,Session,Cookie,ViewState和Cache之间的区别

在ASP.NET中,有很多种保存信息的对象。例如:Application,Session,Cookie,ViewState和Cache等,那么它们有什么区别呢?每一种对象应用的环境是什么?为了更清楚的...
  • lxlj2006
  • lxlj2006
  • 2010年05月19日 16:34
  • 1407

viewstate解密

看完之后,觉得能不用viewstate就不用,再者像这样viewstate["a"]="b";这种简单的赋值是没有什么关系的,它生成的树是很小的,altas一定是用js修改了viewstate的,但方...
  • zb219
  • zb219
  • 2007年05月22日 16:03
  • 2148

viewstate的安全

最近学习viewstae,心得和摘要如下: 由于 ViewState 没有被格式化为清晰的文本,某些人有时会认为它被加密了,其实并没有。相反,ViewState 只是进行了 Base64 编码,以确保...
  • mdot
  • mdot
  • 2004年07月22日 20:34
  • 2167

ASP.NET 的 ViewState Cookie Session 等的比较

ASP.NET 的 ViewState Cookie Session 等的比较
  • zhanghui_hn
  • zhanghui_hn
  • 2014年04月19日 09:20
  • 1674

ViewState EnableViewState 禁用与使用心得

每个web控件都有个ViewState值,如果一个页面有太多的web控件而不禁用他们的viewstate值的话,会让页面速度大大降低。那么哪些控件的 EnableViewState="false...
  • hr541659660
  • hr541659660
  • 2015年11月11日 16:41
  • 2458

python 抓取ASP.NET平台信息 __VIEWSTATE

为了妹子,简化她的工作,所以写了这个。。。。内网有个平台是ASP.net,刚开始没想到这么复杂。。开弓没有回头箭。。每打开一个网页都会有三次请求如图: 且每次请求所包含的 __VIEWSTATE还有...
  • qq_34352010
  • qq_34352010
  • 2016年07月30日 11:16
  • 743

ASP.NET中Application、Session、Cookie、ViewState和Cache的生命周期

转载自 http://hi.baidu.com/cghroom/item/7c3e5d4520505e066dc2f0db 在ASP.NET中,有很多种保存信息的内置对象,如Application,S...
  • biychen
  • biychen
  • 2014年02月12日 15:34
  • 1278

viewState解密

viewState.csd
  • Fanbin168
  • Fanbin168
  • 2014年08月04日 11:39
  • 2722
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET中的ViewState
举报原因:
原因补充:

(最多只允许输入30个字)