使用反射器,我發現在System.Web.UI.WebControls.Parameter
類以下代碼:ASP.NET ParameterCollection(或其ParametersChanged事件)是否依賴於視圖狀態?
internal void UpdateValue(HttpContext context, Control control)
{
object obj2 = this.ViewState["ParameterValue"];
object obj3 = this.Evaluate(context, control);
this.ViewState["ParameterValue"] = obj3;
if (((obj3 == null) && (obj2 != null)) ||
((obj3 != null) && !obj3.Equals(obj2)))
{
this.OnParameterChanged();
}
}
線
this.OnParameterChanged();
是什麼觸發到底ParametersChanged
-event,爲I(在OnParameterChanged
通過this._owner.CallOnParametersChanged()
)理解。
現在我的問題是:如果EnableViewState
設置爲false
(例如在整個頁面上)會發生什麼?並作爲附錄:我使用ControlParameter
s指向SelectedValue
的DropDownList
。
我以爲這將意味着:
obj2
要麼是已經在同一個請求先前設置(即UpdateValue
之前已經調用)或null
如果沒有其他價值尚未設置值。- 作爲
DropDownList
sSelectedValue
不能是null
obj3
永遠不會爲空。 OnParametersChanged
將始終被調用第一次UpdateValues
在任何請求中被調用。
但如果相同的條目回發期間裝入DropDownList
ASP.NET保留在整個回傳列表中選擇即使ViewState中被禁用(我只能猜測是如何工作的,但它確實。 ..)。
這歸結爲以下幾點:如果ViewState被禁用,並且在每個請求中相同的值被加載到DropDownList
並且用戶已經選擇了「很久以前」的條目X並且通過除改變選擇之外的其他方式觸發了回發在DropDownList中,ASP.NET會在ParameterCollecion
上觸發一個ParametersChanged
-event(因爲上面的列表中有#3),儘管在我的理解中參數沒有改變它的值。
我錯了,或者這是否意味着我不能(不應該)禁用ViewState,如果這種行爲造成麻煩?
UPDATE(不直接相關的問題)
只是爲了擺脫這個問題怎麼DropDownList
通過後回來,如果視圖狀態禁用保留了選擇的價值:通過其實施的IPostBackDataHandler
...
反射顯示(在DropDownList
):
protected virtual bool LoadPostData(string postDataKey,
NameValueCollection postCollection)
{
string[] values = postCollection.GetValues(postDataKey);
this.EnsureDataBound();
if (values != null)
{
base.ValidateEvent(postDataKey, values[0]);
int selectedIndex = this.Items.FindByValueInternal(values[0], false);
if (this.SelectedIndex != selectedIndex)
{
base.SetPostDataSelection(selectedIndex);
return true;
}
}
return false;
}
因此,它基本上檢索POST
ed數據中選定項目的值,並且如果它可以在DropDownList
包含的項目列表中找到包含此項目的項目,則將其設置爲選定項目。