ASP.NET中的ViewState

原创 2004年07月17日 10:53:00
 ASP.NET中的ViewState

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总结(三)GridView

由于Asp.Net视频比较旧,涉及到的数据绑定控件DataGrid在VS2012中已经没有了,取而代之的是GridView。开始觉得视频中的例子没法实现了,其实不然,DataGrid里面的功能Grid...
  • wangyajin333
  • wangyajin333
  • 2014年02月19日 14:11
  • 1213

使用PHP的CURL模拟POST采集开了viewstate的asp.net网页数据

/**     QQ群:223494678     函数:模拟post得到所有分页的页面信息     参数:         string $EVENTARGUMENT         st...
  • Allen_Tsang
  • Allen_Tsang
  • 2015年07月27日 18:35
  • 1154

ASP.NET平台下MVC与WebForm两种模式区别(图解)

本文将为大家对比ASP.NET MVC与WebForm的区别,通过这种形式我们能更加了解ASP.NET MVC及其工作原理,也是为了令大家今后的开发工作更加方便,快捷。          1.传统W...
  • shenhuaikun
  • shenhuaikun
  • 2013年04月07日 19:05
  • 1887

使用PHP的CURL模拟POST采集开了viewstate的asp.net网页数据

用.NET做的网站如果做成POST提交方式,且开了viewstate的话,采集起来有点小繁琐,在此跟大家分享一下做法。 采的难点是必須先取得表單裏面的viewstate和datavalidtion兩...
  • sibang
  • sibang
  • 2014年08月21日 16:56
  • 543

ASP.NET 状态管理(视图状态 ViewState)

无论 Web 程序框架多么先进,它都不能改变一个事实:HTTP是一种无状态协议。        每次 Web 请求后,客户端和服务器端断开,同时 ASP.NET 引擎释放页面对象。这种架构保证了...
  • my98800
  • my98800
  • 2016年04月29日 12:58
  • 149

ASP.NET状态管理(视图状态ViewState)

ASP.NET状态管理之十一(视图状态ViewState) 视图状态是 ASP.NET 页框架默认情况下用于保存往返过程之间的页和控件值的方法。当呈现页的 HTML 形式时,需要在回发过程中...
  • yaofayong
  • yaofayong
  • 2012年05月12日 22:09
  • 194

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

在ASP.NET中,有很多种保存信息的对象。例如:Application,Session,Cookie,ViewState和Cache等,那么它们有什么区别呢?每一种对象应用的环境是什么? 为了更清...
  • yangchun1213
  • yangchun1213
  • 2012年03月15日 22:54
  • 501

ASP.NET ViewState 详解

概述 ViewState是一个被误解很深的动物了。我希望通过此文章来澄清人们对ViewState的一些错误认识。为了达到这个目的,我决定从头到尾详细的描述一下整个ViewState的工作机制,其中我...
  • landy_john
  • landy_john
  • 2012年05月18日 16:24
  • 667

ASP.NET的ViewState的取舍

对于大多数程序员而言,viewstate就是页面中的名字叫做__VIEWSTATE的隐藏控件,它使我们页面体积膨胀,不利于页面的seo优化;页面返送间都要携带更多的大量的数据,耗费更多的流量、延长响应...
  • u013598542
  • u013598542
  • 2015年04月09日 20:36
  • 655

[本周]随手记下 Asp.net中Application Session Cookie ViewState Cache Hidden

Application 1.         Application用来保存所有用户共用的信息 2.         在Asp时代,如果要保存的数据在应用程序生存期内不会或者很少发生改变,那么使用...
  • ligaorenvip
  • ligaorenvip
  • 2012年08月30日 10:27
  • 318
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET中的ViewState
举报原因:
原因补充:

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