WebControl.SaveViewState是如何保存视图信息的
我们在Control.SaveViewState是如何保存视图信息的中说的是Control的SaveViewState方法,WebControl继承自Control,WebControl重写了Control.SaveViewState方法,很多web控件都继承于WebControl,所以我们有必要说一下WebControl.SaveViewState()方法,这个方法的源码如下:
private StateBag attrState;
/**//// <internalonly/> 2
/// <devdoc> 3
/// <para>A protected method. Saves any4
/// state that was modified after the TrackViewState method was invoked.</para> 5
/// </devdoc>6
protected override object SaveViewState() {7
Pair myState = null;8
9
// Save values cached out of view state10
if (_webControlFlags[disabledDirty]) { 11
ViewState["Enabled"] = !flags[isWebControlDisabled]; 12
}13
14
if (ControlStyleCreated) {15
// the style shares the StateBag of its owner WebControl16
// call SaveViewState to let style participate in state management17
ControlStyle.SaveViewState(); 18
}19
20
object baseState = base.SaveViewState(); 21
object aState = null;22
if (attrState != null) { 23
aState = attrState.SaveViewState();24
}25

26
if (baseState != null || aState != null) { 27
myState = new Pair(baseState, aState);28
} 29
return myState; 30
}代码的第10行,判断控件的Enabled属性。
代码的第14行,通过ControlStyleCreated的值指示是否已为 ControlStyle 属性创建了 Style 对象。
代码的第20行,表示调用Control.SaveViewState()方法。
我们需要注意的地方地方是ControlStyle和attrState里边存储的都是什么数据?我们平时的哪些操作和这两个集合有关系?
我们先说说ControlStyle,我们通过这个属性存储Web 服务器控件的样式。
WebControl.ControlStyle的源码:
/**//// <devdoc> 2
/// <para>Gets the style of the Web control.</para>3
/// </devdoc> 4
[ 5
Browsable(false),6
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), 7
WebSysDescription(SR.WebControl_ControlStyle)8
]9
public Style ControlStyle {10
get { 11
if (controlStyle == null) {12
controlStyle = CreateControlStyle(); 13
if (IsTrackingViewState) { 14
controlStyle.TrackViewState();15
} 16
if (_webControlFlags[deferStyleLoadViewState]) {17
_webControlFlags.Clear(deferStyleLoadViewState);18
controlStyle.LoadViewState(null);19
} 20
}21
return controlStyle; 22
} 23
}
/**//// <devdoc>2
/// <para> A protected method. Creates the style object that is used internally 3
/// to implement all style-related properties. Controls may override to create an 4
/// appropriately typed style.</para>5
/// </devdoc> 6
protected virtual Style CreateControlStyle() {7
return new Style(ViewState);8
}从以上两个方法可以看出,ControlStyle返回的是Style类型的对象,在实例化Style的过程中,需要ViewState属性,我们知道WebControl的ViewState是继承自Control。我们平时对控件的样式进行操作。例如如下代码:
void Page_Load(Object sender, EventArgs e)
{
this.TextBox1.BackColor = System.Drawing.Color.Red;
}就是通过Style对象,将值存入WebControl.ViewState。
我们说过了ControlStyle属性,下边说说attrState字段,attrState是在WebControl声明的StateBag类型的字段,Attributes属性和attrState字段相关联,但并不是直接调用它,而是通过AttributeCollection,我们一会看看源代码就清楚多了。微软对Attributes的解释为:控件的属性不对应的任意特性(只用于呈现)的集合。老实说,这个解释不好理解,所幸的是,这个属性我们平时用的比较多,理解起来就好多了。
Attributes属性的源码为:
Code2
/**//// <devdoc> 3
/// <para>Gets the collection of attribute name/value pairs expressed on a Web control but4
/// not supported by the control's strongly typed properties.</para>5
/// </devdoc>6
[ 7
Browsable(false),8
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), 9
WebSysDescription(SR.WebControl_Attributes) 10
]11
public AttributeCollection Attributes { 12
get {13
if (attrColl == null) {14

15
if (attrState == null) { 16
attrState = new StateBag(true);17
if (IsTrackingViewState) 18
attrState.TrackViewState(); 19
}20
21
attrColl = new AttributeCollection(attrState);22
}23
return attrColl;24
} 25
}下边还是用代码说明吧,看看Attributes的用法都体现在哪些地方:
void Page_Load(Object sender, EventArgs e)2
{3
//第一种用法4
TextBox1.Attributes["onblur"] = "javascript:alert('Hello! Focus lost from text box!!');";5
//第二种用法6
TextBox1.Attributes.Add("onblur", "javascript:alert('Hello! Focus lost from text box!!');");7
//如果和控件的样式相关,请这样使用8
TextBox1.Attributes.CssStyle.Add(HtmlTextWriterStyle.Cursor, "hand;");9
//如果您要添加的样式在HtmlTextWriterStyle中不存在,写法类似下面所写10
TextBox1.Attributes.CssStyle.Add("otherStyle", "style");11
}WebControl.SaveViewState中主要的东西我们都已经说过了,就不难理解其方法的内涵。




浙公网安备 33010602011771号