Зависит ли ASP.NET ParameterCollection (или его событие ParametersChanged) от состояния представления? - PullRequest
1 голос
/ 09 июня 2010

Используя отражатель, я нашел следующий код в классе 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.

Я предполагаю, что это будет означать:

  1. obj2 будет либобыть значением, которое было установлено ранее в том же запросе (т. е. UpdateValue был вызван ранее) или null, если другое значение еще не было установлено.
  2. Как DropDownList s SelectedValueне может быть null obj3 никогда не будет нулевым.
  3. 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, он устанавливает его как выбранный.

1 Ответ

0 голосов
/ 09 июня 2010

Вы правы: вы не можете отключить состояние представления, если хотите, чтобы «измененные» события и поведение веб-элемента управления ASP.NET работали.

Основной механизм, который они используют для определения того, было ли изменение, заключается всравните значение, сериализованное в viewstate, с эквивалентным объявленным значением (если оно есть).TextBox.TextChanged (например) ясно объясняет это в документации своего класса:

Элемент управления TextBox должен сохранять некоторые значения между публикациями на сервере, чтобы это событие работало правильно.Убедитесь, что для этого элемента управления включено состояние просмотра.

...