ViewState简单类型视图状态应用




视图状态默认支持很多类型数据存储其中基本类型串、数字、布尔值、颜色、日期、字节以及各种类型以下是个最常见典型使用方法:
public Text
{
get
{
String s = (String)ViewState["Text"];
((s null) ? String.Empty : s);
}


{
ViewState["Text"] = value;
}
}
在上面代码中有个ViewState对象此对象没有多么深奥只是基类Control中定义个属性追溯到它基类定义代码如下:
private StateBag _viewState;
[WebSysDescription("Control_State"), Browsable(false), Designer Serializa
tionVisibility(DesignerSerializationVisibility.Hidden)]
protected virtual StateBag ViewState
{
get
{
(this._viewState null)
{
this._viewState = StateBag(this.ViewStateIgnoresCase);
(this.IsTrackingViewState)
{
this._viewState.TrackViewState;
}
}
this._viewState;
}
}
这是个标准自定义类型属性再仔细看该属性类型为StateBage类这才是我们要找关键类代码结构如下:
/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public sealed StateBag : IStateManager, IDictionary, ICollection, IEnumerable
{
// Fields
private IDictionary bag;
private bool ignoreCase;
private bool marked;

// Methods
public StateBag
: this(false)
{
}

public StateBag(bool ignoreCase)
{
this.marked = false;
this.ignoreCase = ignoreCase;
this.bag = this.CreateBag;
}

public StateItem Add( key, object value)
{
(.IsNullOrEmpty(key))
{
throw ExceptionUtil.ParameterNullOrEmpty("key");
}
StateItem item = this.bag[key] as StateItem;
(item null)
{
((value != null) || this.marked)
{
item = StateItem(value);
this.bag.Add(key, item);
}
}
((value null) && !this.marked)
{
this.bag.Remove(key);
}

{
item.Value = value;
}
((item != null) && this.marked)
{
item.IsDirty = true;
}
item;
}

public void Clear
{
this.bag.Clear;
}

private IDictionary CreateBag
{
HybridDictionary(this.ignoreCase);
}

public IDictionaryEnumerator GetEnumerator
{
this.bag.GetEnumerator;
}

public bool IsItemDirty( key)
{
StateItem item = this.bag[key] as StateItem;
((item != null) && item.IsDirty);
}

ernal void LoadViewState(object state)
{
(state != null)
{
ArrayList list = (ArrayList)state;
for ( i = 0; i < list.Count; i 2)
{
key = ((IndexedString)list[i]).Value;
object obj2 = list[i + 1];
this.Add(key, obj2);
}
}
}

public void Remove( key)
{
this.bag.Remove(key);
}

ernal object SaveViewState
{
ArrayList list = null;
(this.bag.Count != 0)
{
IDictionaryEnumerator enumerator = this.bag.GetEnumerator;
while (enumerator.MoveNext)
{
StateItem item = (StateItem)enumerator.Value;
(item.IsDirty)
{
(list null)
{
list = ArrayList;
}
list.Add( IndexedString(()enumerator.Key));
list.Add(item.Value);
}
}
}
list;
}

public void SetDirty(bool dirty)
{
(this.bag.Count != 0)
{
foreach (StateItem item in this.bag.Values)
{
item.IsDirty = dirty;
}
}
}

public void SetItemDirty( key, bool dirty)
{
StateItem item = this.bag[key] as StateItem;
(item != null)
{
item.IsDirty = dirty;
}
}

void ICollection.CopyTo(Array .gif' />, index)
{
this.Values.CopyTo(.gif' />, index);
}

void IDictionary.Add(object key, object value)
{
this.Add(()key, value);
}

bool IDictionary.Contains(object key)
{
this.bag.Contains(()key);
}

void IDictionary.Remove(object key)
{
this.Remove(()key);
}

IEnumerator IEnumerable.GetEnumerator
{
this.GetEnumerator;
}

void IStateManager.LoadViewState(object state)
{
this.LoadViewState(state);
}

object IStateManager.SaveViewState
{
this.SaveViewState;
}

void IStateManager.TrackViewState
{
this.TrackViewState;
}

ernal void TrackViewState
{
this.marked = true;


}

// Properties
public Count
{
get
{
this.bag.Count;
}
}

ernal bool IsTrackingViewState
{
get
{
this.marked;
}
}

public object this[ key]
{
get
{
(.IsNullOrEmpty(key))
{
throw ExceptionUtil.ParameterNullOrEmpty("key");
}
StateItem item = this.bag[key] as StateItem;
(item != null)
{
item.Value;
}
null;
}

{
this.Add(key, value);
}
}

public ICollection Keys
{
get
{
this.bag.Keys;
}
}

bool ICollection.IsSynchronized
{
get
{
false;
}
}

object ICollection.SyncRoot
{
get
{
this;
}
}

bool IDictionary.IsFixedSize
{
get
{
false;
}
}

bool IDictionary.IsReadOnly
{
get
{
false;
}
}

object IDictionary.this[object key]
{
get
{
this[()key];
}

{
this[()key] = value;
}
}

bool IStateManager.IsTrackingViewState
{
get
{
this.IsTrackingViewState;
}
}

public ICollection Values
{
get
{
this.bag.Values;
}
}
}
该类继承了 4个接口:IStateManagerIDictionaryICollectionIEnumerableIStateManager即.NET Framework为自定义视图状态管理提供接口到这里您应该明白我们直接使用ViewState对象时其实是隐式用到了IStateManager接口只不过Control类不是继承IStateManager实现而是采用关联对象方式把StateBag类个例子作为自己个属性保持而已这样从技术角度能够把IStateManager接口几个思路方法和Control对Control控件生命周期支持几个同名思路方法区别开来(它们命名是相同)另外这几个思路方法在使用上也非常简便直接通过属性方式使用否则使用时就要重写基类思路方法实现显得比较笨重且缺乏灵活性
后面 3个接口IDictionaryICollectionIEnumerable主要为视图对象存储集合以及对集合快速检索提供支持在这里可以看到我们使用ViewState在服务端也存储在个标准IDictionary类型中如下:
private IDictionary bag;
IDictionary集合采用键(类型)/值(object类型)格式存储除了bag对象还有两个内部变量:
private bool ignoreCase;
private bool marked;
ignoreCase指定在集合中存储键是否忽略大小写marked变量就标记是否启用了跟踪监控变量只有当该值为true时才把值保存到视图集合对象中否则如果集合中有该对象就移除它在Add思路方法核心代码片段中体现了这代码如下:
/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public StateItem Add( key, object value)
{
//… …
StateItem item = this.bag[key] as StateItem;
(item null)
{
((value != null) || this.marked)
{
item = StateItem(value);
this.bag.Add(key, item);
}
}
((value null) && !this.marked)
{
this.bag.Remove(key);
}

{
item.Value = value;
}
((item != null) && this.marked)
{
item.IsDirty = true;
}
item;
}
段代码比较严谨除了判断marked是否为true还判断要增加对象是否为null如果为null也不会增加到视图集合列表对象中另外在视图集合中对应值类型为StateItem代码如下所示:
/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public sealed StateItem
{
// Fields
private bool isDirty;
private object value;

// Methods
ernal StateItem(object initialValue);

// Properties
public bool IsDirty { get; ; }
public object Value { get; ; }
}
在这里除了定义了存储数据内容object对象value属性外还有个Dirty属性该属性值标志当前集合中个对象是否是脏数据(即被改动过了)SaveViewState思路方法只对脏数据进行保存以便提高性能SaveViewState代码片段如下:
/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
ernal object SaveViewState
{
ArrayList list = null;
(this.bag.Count != 0)
{
IDictionaryEnumerator enumerator = this.bag.GetEnumerator;
while (enumerator.MoveNext)
{
StateItem item = (StateItem)enumerator.Value;
(item.IsDirty)
{
(list null)
{
list = ArrayList;
}
list.Add( IndexedString(()enumerator.Key));
list.Add(item.Value);
}
}
}
list;
}
代码体中语句(item.IsDirty)就是对要保存序列化对象进行过滤最终返回list集合对象中itemDirty属性值都为true


StateBag类关键点就介绍这些StateBag是.NETFramework提供个比较实用并且它实现了IStateManager可以作为自定义类型视图、状态个典型例子在实现自己视图状态类时完全可以参考它在实际开发时很多情况下也并非定要显示继承 IStateManager接口系统类有些类型继承了IStateManager比如Style这样我们可以直接拿来使用还有它些派生类TableItemStyleTableStylePanelStyle 都可以直接在Control控件开发中使用后面会介绍个使用TableItemStyle作为基类实现自定义类型视图状态举例

Tags:  物化视图 sql视图 三视图

延伸阅读

最新评论

发表评论