子控件的viewstate
当子控件被添加到父控件的时候. 父控件会根据其当前的control阶段来调用该子控件的一些方法,让子控件赶上父控件的control阶段.其中的一个结果是在Init后面调用了子控件的TrackViewState.
详细参见:
http://blog.joycode.com/saucer/archive/2004/10/21/36124.aspx
而子控件的TrackViewState代码:
它会调用当前子控件的_viewState属性的 TrackViewState() 方法.也就是StateBag类的TrackViewState() 方法.
而 StateBag 的TrackViewState() 方法主要设置了marked = true
这时候就表明这个子控件被跟踪上了.也就是说在被跟踪的前提下,发生任何变化都会导致 状态被保存
这里当控件新增或者改变ViewState 值都会调用这个方法
当改变 ViewState 的值时: 设置了 item.IsDirty = true;
而 IsDirty 这个属性是决定是不是最后被保存的主要依据.
总结一下:
1如何要想状态被viewstate 保存,先必须需要 TrackViewState(标记)
2标记后控件的值需要改变,如果不改变也就没有必要保存viewstate 值了.因为这样会造成viewstate 资源浪费.
详细参见:
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 资源浪费.