Что Вы делаете, когда Вы не можете использовать ViewState?

простой способ в котлине

if (kotlin.run{ a=b; a != c}){ ... }
7
задан Charles Menguy 26 April 2012 в 05:55
поделиться

7 ответов

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

Почему необходимо явно аннулировать значение (кроме управления памятью, и т.д.)? Разве это не опция проверить Page. IsPostback, и или делают что-то с Переменной сеанса или нет?

1
ответ дан 7 December 2019 в 10:11
поделиться

Метод LoadViewState на странице является определенно ответом. Вот общее представление:

protected override void LoadViewState( object savedState ) {
  var savedStateArray = (object[])savedState;

  // Get repeaterData from view state before the normal view state restoration occurs.
  repeaterData = savedStateArray[ 0 ];

  // Bind your repeater control to repeaterData here.

  // Instruct ASP.NET to perform the normal restoration of view state.
  // This will restore state to your dynamically created controls.
  base.LoadViewState( savedStateArray[ 1 ] );
}

SaveViewState должен создать массив savedState, который мы используем выше:

protected override object SaveViewState() {
  var stateToSave = new List<object> { repeaterData, base.SaveViewState() };
  return stateToSave.ToArray();
}

Не забывайте также связывать повторитель в Init или Load с помощью кода как это:

if( !IsPostBack ) {
  // Bind your repeater here.
}
4
ответ дан 7 December 2019 в 10:11
поделиться

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

0
ответ дан 7 December 2019 в 10:11
поделиться

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

2) Если Вы не можете понять это, возможно, можно ли выключить состояние отображения для страницы дыры и затем положиться ли только на querystring для изменений состояния? Любая ссылка, которая была ранее обратной передачей, будет ссылкой на другой URL (или перенаправление обратной передачи).

Это может действительно уменьшить вес страницы и помочь избежать проблем с ViewState.

0
ответ дан 7 December 2019 в 10:11
поделиться

Я всегда воссоздавал свои динамические средства управления в событии LoadViewState. Можно сохранить количество средств управления, должен был быть создан в состоянии отображения и затем динамично создать это многие из них использующий метод LoadControl в событии LoadViewState. В этом случае у Вас есть доступ к ViewState, но он еще не был восстановлен средствам управления на странице.

1
ответ дан 7 December 2019 в 10:11
поделиться
protected override void LoadViewState(object savedState)
{
   // Put your code here before base is called
   base.LoadViewState(savedState);
}

Это то, что Вы имели в виду? Или Вы имели в виду, в каком порядке обрабатываются средства управления? Я думаю, что ответ на это - это квазислучайный.

Кроме того, почему Вы не можете загрузить объекты, с которыми Вы связываете перед Page_Load? Нормально называть Ваш бизнес-слой в любое время в течение жизненного цикла страницы, если Вы имеете к, за исключением предварительного рендеринга и чего-нибудь после.

0
ответ дан 7 December 2019 в 10:11
поделиться

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

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

  1. На первой загрузке связывают Ваш главный пользовательский элемент управления с объектом во время OnPreInit. Храните объект на сессии. Состояние отображения будет автоматически сохранено для тех средств управления. Если необходимо связать управление в первый раз на Page_Load, который в порядке, но Вы закончите тем, что имели два события, которые вызов связывает при выполнении следующего шага.
  2. На обратной передаче снова переплетите свой главный пользовательский пользовательский элемент управления в методе OnPreInit против объекта, который Вы хранили на сессии. Все Ваши средства управления должны быть воссозданы перед загрузкой состояния отображения. Затем, когда состояние отображения восстанавливается, значения будут установлены к тому, что находится в состоянии отображения. Единственный протест здесь состоит в том, что, когда Вы связываете снова на обратной передаче, необходимо сделать 100% уверенными, что то же количество средств управления создается снова. Ключ к использованию Повторителей, Gridviews и т.д.... с динамическими средствами управления в них - то, что они должны быть восстановлением на каждой обратной передаче, прежде чем состояние отображения будет загружено. OnPreInit обычно является лучшим местом, чтобы сделать это. Нет никакого технического ограничения в платформе, которая диктует, что необходимо сделать всю работу в Page_Load на первой загрузке.

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

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

Править: Я изменил все ссылки на OnInit к OnPreInit в этом решении. Я забыл, что MS представил это новое событие в ASP.NET 2.0. Согласно их документации жизненного цикла страницы, OnPreInit - то, где динамические средства управления должны быть созданы/воссозданы.

0
ответ дан 7 December 2019 в 10:11
поделиться
Другие вопросы по тегам:

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