Вопрос по viewstate, user-controls, asp.net, properties – Пользовательский элемент управления (ascx) и свойства

21

Единственный способ сохранить значения свойств в пользовательском элементе управления - использовать ViewState.

public string Title {
        get { return Convert.ToString(ViewState["Title"]); }
        set { ViewState["Title"] = value; }
    }

Я не могу сказать, что я действительно впечатлен этим, так как чем больше свойств пользовательского элемента управления, тем больше дерьма вы будете придерживаться во ViewState. Есть ли лучший способ сохранить свойства?

Все веб-элементы управления делают это одинаково, поэтому ViewState становится огромным ... Robert Koritnik
Я должен был прибегнуть к этому в конце. Это довольно расстраивает, как это работает, но это делает работу .. хорошо пока .. :) Bat_Programmer

Ваш Ответ

6   ответов
-1

помните, что http не имеет состояния, поэтому вы можете просто сбросить свой заголовок на каждомpage_load

Так что же происходит, когда у вас есть два запроса, и они оба хотят использовать разные свойства в пользовательском элементе управления?
5

Для сохранения свойств элемента управления в обратных передачах, так что ваше решение просто отлично.

Вы можете сохранить его в сеансе, но на самом деле это просто обременяет сервер. В зависимости от количества пользователей, которые у вас есть, это может очень быстро стать ужасно.

Также имейте в виду, что вы должны делать некоторые домашние дела, если вы используете сеанс. Например, если вы хотите использовать свой пользовательский элемент управления дважды на одной странице, необходимо убедиться, что каждый элемент управления использует уникальные переменные сеанса.

0

SaveViewState/LoadViewState методы:

public string Title { get; set; }

А затем сохраните и загрузите как требуется:

protected override object SaveViewState()
{
   // Save State as a cumulative array of objects.
   object baseState = base.SaveViewState();

   object[] allStates = new object[2];
   allStates[1] = _title;
   return allStates;
}

protected override void LoadViewState(object savedState)
{
   if (savedState != null)
   {
      // Load State from the array of objects that was saved during SavedViewState.
      object[] myState = (object[])savedState;
      if (myState[0] != null)
         base.LoadViewState(myState[0]);

      if (myState[1] != null)
         _title = (String)myState[1];
   }
}
2

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

Вы также можете захотеть взглянуть на ControlState - это отдельная "сумка" что люди не могут отключить его и используются для таких вещей, как GridView, где есть некоторые вещи, которые нельзя отключить с помощью viewstate, потому что это нарушает управление.

8

войств для пользовательского элемента управления.

Ваше утверждение "чем больше свойств у пользовательского элемента управления, тем больше дерьма" застрянет "во ViewState & quot; хотя это не обязательно так. Разумеется, ViewState может отслеживать значения свойств для элементов управления, но не хранить данные в__VIEWSTATE скрытая переменная поля формы.

Звучит безумно, верно? УвидетьTRULY Понимание ViewState для блестящей статьи о том, как работает ViewState.

Это зависит от того, когда вы инициализируете свойства своих элементов управления в его жизненном цикле. ViewState будет храниться только в скрытом__VIEWSTATE поле послеStateBag для элемента управления начинается отслеживание изменений значений свойств. Это происходит вOnInit метод для элемента управления, который находится на ранней стадии жизненного цикла, но существуют методы, позволяющие установить значения свойств ранее, что не приведет к затратам на__VIEWSTATE раздувать и все равно даст вам все преимущества.

Смотрите связанную статью. Здесь все обсуждается очень четко и лучше, чем я могу :-)

10

чтобы значения свойств были сохранены после постбэка, вам придется использовать ViewState или Session. Так как эти элементы управления воссоздаются в каждом посте, вы не можете поддерживать это состояние иначе.

«чтобы быть сохраненным после постбэка, вам придется использовать ViewState или Session». Это не так для ViewState. ViewState сохраняется только между постбеками, а не за их пределами.
Да, значения свойств должны сохраняться через обратную передачу. У меня есть кнопка в пользовательском элементе управления, которая вызывает событие кнопки при нажатии (duh), и именно в это время мне нужно получить определенные значения свойств. Ну, ладно, думаю, я просто раздул ViewState! Jagd

Похожие вопросы