Используя отражатель, я нашел следующий код в классе System.Web.UI.WebControls.Parameter
:
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
в конце,как я понимаю (через this._owner.CallOnParametersChanged()
в OnParameterChanged
).
Теперь мой вопрос: что произойдет, если EnableViewState
установлен на false
(например, на всей странице)?И как дополнение: я использую ControlParameter
s, указывающие на SelectedValue
DropDownList
.
Я предполагаю, что это будет означать:
obj2
будет либобыть значением, которое было установлено ранее в том же запросе (т. е. UpdateValue
был вызван ранее) или null
, если другое значение еще не было установлено. - Как
DropDownList
s SelectedValue
не может быть null
obj3
никогда не будет нулевым. OnParametersChanged
всегда будет вызываться при первом вызове UpdateValues
в любом запросе .
Но если те же записи загружаются в DropDownList
во время PostBack, ASP.NET сохраняет выбор в списке через PostBack, даже если ViewState отключен (я могу только догадываться, как это работает, ноэто делает ...).
Это сводится к следующему: если ViewState отключен и одни и те же значения загружаются в DropDownList
при каждом запросе, и пользователь выбрал запись X "давно"и вызвал PostBack другими способами, чем изменение выбора в DropDownList ASP.NETParametersChanged
-эвент на ParameterCollecion
(из-за # 3 в списке выше), хотя в моем понимании параметр не изменил своего значения.
Я ошибаюсь или это означает, что я не могу (не следует) отключить ViewState, если это поведение вызывает проблемы?
ОБНОВЛЕНИЕ (не имеет прямого отношения к вопросу)
Просто чтобы избавиться от вопроса, какDropDownList
сохраняет выбранное значение через сообщение назад, если viewstate отключено: его реализация 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
, он устанавливает его как выбранный.