我们在用.net开发web应用程序的时候经常会用到ViewState,真是个很有用的东东,那么ViewState到底是何方人氏那?
其实ViewState只是StateBag类的一个实例,所以我们平时看到的只是冰山的一角,现在我们就来探究一下下面的更大的冰山.
*********************************************************************************************
NET Framework类库
StateBag 类
1. 概述
管理 ASP.NET 服务器控件(包括页)的视图状态。无法继承此类。
Control.ViewState 属性是 StateBag 类的实例。
有关此类型所有成员的列表,请参阅 StateBag 成员。
System.Object
System.Web.UI.StateBag
[定义][C#]
public sealed class StateBag : IStateManager, IDictionary,ICollection, IEnumerable
[线程安全]
此类型的所有公共静态(Visual Basic 中为 Shared)成员对多线程操作而言都是安全的。但不保证任何实例成员是线程安全的。
[备注]
页或控件的视图状态是该页或控件的累计属性值或视图。可以通过 Control.ViewState 属性访问此类。
此类是所有 HTML 和 Web 服务器控件的主存储机制。它将属性/值对存储为与控件关联的字符串。仅在为页请求执行 OnInit 方法后,它才跟踪这些属性的更改,并将更改保存到页或控件的视图状态。
在控件处理生存期的任何阶段可以从此类读取,但是当控件正在呈现时不应该向此类写入。
此类实现一个字典,可以像对待任何字典对象那样从其中添加或移除项。有关数据集合(如字典)的更多信息,请参见将数据组合到集合中。
[示例]
下面的示例说明一个具有 Text 和 FontSize 属性的复合 Label 控件。当在该控件上调用 Control.Render 方法时,这些属性保存到视图状态并从视图状态检索。
-------------------------------------------------------------------------------------------------------
[C#]
// This control renders values stored in view state for Text and FontSize properties.
using System;
using System.Web;
using System.Web.UI;
namespace ViewStateControlSamples {
public class Label: Control {
// Add property values to view state with set;
// retrieve them from view state with get.
public String Text {
get {
return (String) ViewState["Text"];
}
set {
ViewState["Text"] = value;
}
}
public int FontSize {
get {
return (int) ViewState["FontSize"];
}
set {
ViewState["FontSize"] = value;
}
}
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
protected override void Render(HtmlTextWriter output) {
output.Write("" + this.Text + "");
}
}
}
---------------------------------------------------------------------------------------------
2.构造函数
2.1 StateBag 构造函数
public StateBag();
初始化 StateBag 类的新实例。这是此类的默认构造函数。
public StateBag(bool);
初始化 StateBag 类的新实例,该实例允许存储的状态值不区分大小写。
忽略大小写为 true;否则为 false。
3.属性
3.1
StateBag.Count 属性
获取 StateBag 对象中的 StateItem 对象数。
属性值 是 StateBag 对象中的项数。
实现
ICollection.Count
使用示例:
-----------------------------------------------------
[C#]
private string GetMruList(string selectedValue) {
StateBag state = ViewState;
if (state.Count 0) {
int upperBound = state.Count;
string[] keys = new string[upperBound];
StateItem[] values = new StateItem[upperBound];
state.Keys.CopyTo(keys, 0);
state.Values.CopyTo(values, 0);
StringBuilder options = new StringBuilder();
for(int i = 0; i
options.AppendFormat("{2}", (selectedValue == keys[i])?"selected":"", keys[i], values[i].Value);
}
return options.ToString();
}
return "";
}
----------------------------------------------------------------------------
3.2
StateBag.Item 属性
获取或设置在 StateBag 对象中存储的项的值。
[C#] 在 C# 中,该属性为 StateBag 类的索引器。
属性值 是 StateBag 对象中的指定项。
备注:使用该成员是为控件或页保存和检索视图状态值的最简单方法。
如果在设置该属性时项尚未存储在 StateBag 对象中,则项的键/值对将添加到集合中。在项上调用 TrackViewState 方法之前,如果将该属性设置为空引用(Visual Basic 中为 Nothing),则项从 StateBag 对象中被移除。否则,当将该属性设置为空引用 (Nothing) 时,将保存键以便能够跟踪项的视图状态。
示例:下面的示例说明一个将名称和值作为键/值对保存到 Control.ViewState 属性的属性。
(Control.ViewState 属性是 StateBag 类的实例。)
---------------------------------------------------------------------------------
[C#]
// Add property values to view state with set;
// retrieve them from view state with get.
public String Text {
get {
return (String) ViewState["Text"];
}
set {
ViewState["Text"] = value;
}
}
----------------------------------------------------------------------------------
3.3
StateBag.Keys 属性
获取表示 StateBag 对象中的项的键集合。
属性值 是
键集合。
实现:IDictionary.Keys
备注:这些键是控件属性的名称。例如,如果在自定义的 Table 控件上创建 BGColor 属性,则在此集合中将创建一个 BGColor 项来表示 Table 控件的那个属性。
这些键与 StateBag 中为当前页或服务器控件存储的 StateItem 对象的名称相对应。
可以使用 StateBag.GetEnumerator 方法循环访问该集合。
[C#] 下面的示例说明如何使用 Keys 属性。
---------------------------------------------------------------------
[C#]
private string GetMruList(string selectedValue) {
StateBag state = ViewState;
if (state.Count 0) {
int upperBound = state.Count;
string[] keys = new string[upperBound];
StateItem[] values = new StateItem[upperBound];
state.Keys.CopyTo(keys, 0);
state.Values.CopyTo(values, 0);
StringBuilder options = new StringBuilder();
for(int i = 0; i
options.AppendFormat("{2}", (selectedValue == keys[i])?"selected":"", keys[i], values[i].Value);
}
return options.ToString();
}
return "";
}
---------------------------------------------------------------------
3.4 StateBag.Values 属性
获取存储在 StateBag 对象中的视图状态值的集合。
属性值
是
视图状态值的集合。
实现
:IDictionary.Values
备注
:这是包含指定页或控件中的所有 StateItem 对象的值的集合。可以使用 StateBag.GetEnumerator 方法循环访问这些值。
示例
:[C#] 下面的示例说明如何使用 Values 属性。
----------------------------------------------------------------------
[C#]
private string GetMruList(string selectedValue) {
StateBag state = ViewState;
if (state.Count 0) {
int upperBound = state.Count;
string[] keys = new string[upperBound];
StateItem[] values = new StateItem[upperBound];
state.Keys.CopyTo(keys, 0);
state.Values.CopyTo(values, 0);
StringBuilder options = new StringBuilder();
for(int i = 0; i
options.AppendFormat("{2}", (selectedValue == keys[i])?"selected":"", keys[i], values[i].Value);
}
return options.ToString();
}
return "";
}
-----------------------------------------------------------------------
4.方法
4.1 StateBag.Add 方法
[概述]将新的 StateItem 对象添加到 StateBag 对象。如果项已经存在于 StateBag 中,则它更新项的值。
[调用形式][C#]
public StateItem Add(
string key,
object value
);
[参数]
key
StateItem 对象的属性名称。
value
要添加到 StateBag 的项的值。
[返回值]
返回表示添加到视图状态的对象的 StateItem 对象。
[异常]
异常类