asp.net 動態(tài)創(chuàng)建TextBox控件及狀態(tài)數據如何加載
接著上文Asp.net TextBox的TextChanged事件你真的清楚嗎? 這里我們來說說狀態(tài)數據時如何加載的。
雖然在Control中有調用狀態(tài)轉存的方法,但是這里有一個判斷條件 if (_controlState >= ControlState.ViewStateLoaded) 一般的get請求這里的條件是不滿足的。
internal enum ControlState
{
Constructed,
FrameworkInitialized,
ChildrenInitialized,
Initialized,
ViewStateLoaded,
Loaded,
PreRendered
}
我們知道在page的ProcessRequest中this.ControlState = ControlState.FrameworkInitialized;ProcessRequestMain方法中在Init后有調用this.InitRecursive(null);在這個方法里面有這么一句_controlState = ControlState.Initialized;,在LoadAllState()方法中有這么一句 base.LoadViewStateRecursive(second.Second);,而LoadViewStateRecursive中又有_controlState = ControlState.ViewStateLoaded這句帶代碼,所以我們在Page_load中動態(tài)條件控件時, if (_controlState >= ControlState.ViewStateLoaded)條件成立,如圖:
所以在運行this.form1.Controls.Add(txt);這句以前,txt的值為demo1,
如圖
但是運行以后之就發(fā)生變化了:
當然這里的txt.Text值也是我上次post過來的舊值,新值是在控件的LoadPostData方法中重新綁定。在默認的LoadViewStateRecursive方法中有一個很重要的判斷
internal void LoadViewStateRecursive(object savedState) {
// nothing to do if we have no state
if (savedState == null || flags[disableViewState])
return;
。。。。。。。
_controlState = ControlState.ViewStateLoaded
}
大家看到我上面是一個CustTextBoxt : TextBox控件,如果我們直接添加TextBox控件的話,那么著這里的txt.Text一直都是demo1,可見控件動態(tài)添加的時候是否加載狀態(tài)數據與狀態(tài)數據的保存有關。而狀態(tài)數據的保存主要就是SaveViewState完成的,這里我第一次post的時候SaveViewState返回數據:
所以第二次能取到上次post過來的數據。
其中與SaveViewState有關的方法主要有:
public class TextBox : WebControl, IPostBackDataHandler, IEditableTextControl {
protected override object SaveViewState() {
if (SaveTextViewState == false) {
ViewState.SetItemDirty("Text", false);
}
return base.SaveViewState();
}
private bool SaveTextViewState {
get {
//
// Must be saved when
// 1. There is a registered event handler for SelectedIndexChanged
// 2. Control is not enabled or visible, because the browser's post data will not include this control
// 3. The instance is a derived instance, which might be overriding the OnTextChanged method
if (TextMode == TextBoxMode.Password) {
return false;
}
if ((Events[EventTextChanged] != null) ||
(IsEnabled == false) ||
(Visible == false) ||
(ReadOnly) ||
(this.GetType() != typeof(TextBox))) {
return true;
}
return false;
}
}
}
public class WebControl : Control, IAttributeAccessor {
protected override object SaveViewState() {
Pair myState = null;
// Save values cached out of view state
if (_webControlFlags[disabledDirty]) {
ViewState["Enabled"] = !flags[isWebControlDisabled];
}
if (ControlStyleCreated) {
// the style shares the StateBag of its owner WebControl
// call SaveViewState to let style participate in state management
ControlStyle.SaveViewState();
}
object baseState = base.SaveViewState();
object aState = null;
if (attrState != null) {
aState = attrState.SaveViewState();
}
if (baseState != null || aState != null) {
myState = new Pair(baseState, aState);
}
return myState;
}
}
public class Control : IComponent, IParserAccessor, IUrlResolutionService, IDataBindingsAccessor, IControlBuilderAccessor, IControlDesignerAccessor, IExpressionsAccessor {
protected virtual object SaveViewState() {
// Save values cached out of view state
if (flags[visibleDirty]) {
ViewState["Visible"] = !flags[invisible];
}
if (flags[validateRequestModeDirty]) {
ViewState["ValidateRequestMode"] = (int)ValidateRequestMode;
}
if (_viewState != null)
return _viewState.SaveViewState();
return null;
}
}
public sealed class StateBag : IStateManager, IDictionary {
internal object SaveViewState() {
ArrayList data = null;
if (bag.Count != 0) {
IDictionaryEnumerator e = bag.GetEnumerator();
while (e.MoveNext()) {
StateItem item = (StateItem)(e.Value);
if (item.IsDirty) {
if (data == null) {
data = new ArrayList();
}
#if OBJECTSTATEFORMATTER
data.Add(new IndexedString((string)e.Key));
#else
data.Add(e.Key);
#endif
data.Add(item.Value);
}
}
}
return data;
}
}
到這里我們知道保存狀態(tài)信息主要是在StateBag 的SaveViewState方法中,這里有一個檢查 if (item.IsDirty) ,在TextBox的SaveViewState方法中有一個判斷
if (SaveTextViewState == false) {
ViewState.SetItemDirty("Text", false);
}
與它的SaveTextViewState 屬性有關。
那么我們可以總結一下:動態(tài)創(chuàng)建的控件默認是在被添加的時候加載器狀態(tài)數據,如果是靜態(tài)添加的數據那就是LoadAllState來處理狀態(tài)數據的加載。狀態(tài)數據的加載與控件的SaveViewState密切相關,如果該方法的返回值為null既沒有狀態(tài)信息,那也不需要加載什么狀態(tài)信息了。
相關文章
把.net Core 項目遷移到VS2019 for MAC的方法步驟
這篇文章主要介紹了把.net Core 項目遷移到VS2019 for MAC的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03ASP.NET筆記之 Request 、Response 與Server的使用
本篇文章小編為大家介紹,ASP.NET筆記之 Request 、Response 與Server的使用。需要的朋友參考下2013-04-04.NET RulesEngine(規(guī)則引擎)的使用詳解
這篇文章主要介紹了.NET RulesEngine(規(guī)則引擎)的使用詳解,幫助大家更好的理解和學習使用.net技術,感興趣的朋友可以了解下2021-05-05CZGL.ProcessMetrics監(jiān)控.NET應用
這篇文章介紹了CZGL.ProcessMetrics監(jiān)控.NET應用的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04