子控件的viewstate

当子控件被添加到父控件的时候. 父控件会根据其当前的control阶段来调用该子控件的一些方法,让子控件赶上父控件的control阶段.其中的一个结果是在Init后面调用了子控件的TrackViewState.
详细参见:
http://blog.joycode.com/saucer/archive/2004/10/21/36124.aspx

而子控件的TrackViewState代码:

protected virtual void TrackViewState()
            {
            if (this._viewState != null)
            {
            this._viewState.TrackViewState();
            }
            this.flags[2] = true;
            }
            

它会调用当前子控件的_viewState属性的 TrackViewState() 方法.也就是StateBag类的TrackViewState() 方法.
而  StateBag 的TrackViewState() 方法主要设置了marked = true
internal void TrackViewState()
            {
            this.marked = true;
            }
            

            

这时候就表明这个子控件被跟踪上了.也就是说在被跟踪的前提下,发生任何变化都会导致 状态被保存
public StateItem Add(string key, object value)
            {
            if ((key == null) || (key.Length == 0))
            {
            throw new ArgumentException(HttpRuntime.FormatResourceString("Key_Cannot_Be_Null"));
            }
            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;
            }
            

            

这里当控件新增或者改变ViewState 值都会调用这个方法
当改变 ViewState 的值时: 设置了 item.IsDirty = true;
IsDirty 这个属性是决定是不是最后被保存的主要依据.

internal object SaveViewState()
            {
            ArrayList x = null;
            ArrayList y = null;
            if (this.bag.Count != 0)
            {
            IDictionaryEnumerator enumerator = this.bag.GetEnumerator();
            while (enumerator.MoveNext())
            {
            StateItem item = (StateItem) enumerator.Value;
            if (item.IsDirty)
            {
            if (x == null)
            {
            x = new ArrayList(5);
            y = new ArrayList(5);
            }
            x.Add(enumerator.Key);
            y.Add(item.Value);
            }
            }
            if (x != null)
            {
            return new Pair(x, y);
            }
            }
            return null;
            }
            

            


总结一下:
1如何要想状态被viewstate 保存,先必须需要 TrackViewState(标记)
2标记后控件的值需要改变,如果不改变也就没有必要保存viewstate 值了.因为这样会造成viewstate 资源浪费.

posted on 2008-04-10 10:32  kasafuma  阅读(216)  评论(0编辑  收藏  举报