ASP.NET中的ViewState

类别:.NET开发 点击:0 评论:0 推荐:

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 才是持续的。

 

最后略提一句在Stryonhttp://www.stryon.com.cn)公司的产品iNET(转换.NET APPJava代码,http://208.49.57.227:8080/downloads/Default.aspx )中用Java实现ViewState ,使用上没什么区别。

本文地址:http://com.8s8s.com/it/it45816.htm