相信大家都用过viewstate,但他内部到底是什么实现的呢。相信都是知之甚少。下面我们就来研究一下viewstate吧。 public class Content : Control, IDataItemContainer { public string Title { get; set; } public string Author { get; set; } public string Contents { get; set; } //ViewState["TestVeiwState"] 实际是个索引 public string TestVeiwState{ get { return ViewState["TestVeiwState"] != null ? (string)ViewState["TestVeiwState"] : String.Empty; } set { ViewState["TestVeiwState"] = value; } } public object DataItem { get { return this; } } public int DataItemIndex { get { return 0; } } public int DisplayIndex { get { return 0; } } private StateBag _viewState; protected override StateBag ViewState//重写Control中的ViewState { get { if (_viewState == null) { _viewState = new StateBag(false); //将StateBag的Mark设置为false if (base.IsTrackingViewState) ((IStateManager)_viewState).TrackViewState(); //将StateBag的Mark设置为true; } return _viewState; } } /*StateBag 源代码 public object this[string key] { get { if (string.IsNullOrEmpty(key)) { throw ExceptionUtil.ParameterNullOrEmpty("key"); } StateItem item = this.bag[key] as StateItem; if (item != null) { return item.Value; } return null; } set { this.Add(key, value); } } */ #region IStateManager 成员 protected override void LoadViewState(object savedState) { if (savedState != null) { ((IStateManager)ViewState).LoadViewState(savedState); } } /*StateBag 源代码 internal void LoadViewState(object state) { if (state != null) { ArrayList list = (ArrayList) state; //把所有的ViewState键值对初始化到Arraylist中 for (int i = 0; i < list.Count; i += 2) { string key = ((IndexedString) list[i]).Value; object obj2 = list[i + 1]; this.Add(key, obj2); //把所有的键值对存储到this.bag这个集合中 } } } -------------------------------------------------------------------------this.Add(key, obj2); public StateItem Add(string key, object value) { if (string.IsNullOrEmpty(key)) { throw ExceptionUtil.ParameterNullOrEmpty("key"); } StateItem item = this.bag[key] as StateItem; if (item == null) { if ((value != null) || this.marked) { item = new StateItem(value); this.bag.Add(key, item); } } else if ((value == null) && !this.marked) { this.bag.Remove(key); } else { item.Value = value; } if ((item != null) && this.marked) { item.IsDirty = true; } return item; } */ protected override object SaveViewState() { object savedState = null; if (_viewState != null) { savedState =((IStateManager)_viewState).SaveViewState(); //存放在一个arrarylist里奇数为key,偶数为value; } return savedState; } /* internal object SaveViewState() { ArrayList list = null; if (this.bag.Count != 0) { IDictionaryEnumerator enumerator = this.bag.GetEnumerator(); while (enumerator.MoveNext()) { StateItem item = (StateItem) enumerator.Value; if (item.IsDirty) { if (list == null) { list = new ArrayList(); } list.Add(new IndexedString((string) enumerator.Key)); list.Add(item.Value); } } } return list; } */ #endregion }