子控件的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 资源浪费.

你可能感兴趣的:(view)