Подтвердить что ты не робот

Пользовательский контроль (ascx) и свойства

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Вы всегда можете переопределить предполагаемые методы 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];
   }
}

Ответ 6

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