Сохранение ViewState в SessionPageStatePersister

Я хочу сохранить viewstate конкретной страницы в сеансе, но следующий код не помогает мне, что я могу потерять?

Итак, вот содержимое файла на моей странице;

    public partial class ConfigurationEditorWebForm : PageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected override bool VerifyAccess()
        {
            return true;
        }

        protected override PageStatePersister PageStatePersister
        {
            get
            {
                return new SessionPageStatePersister(this);
            }
        }
    }

Ответ 1

Обратите внимание, что даже после того, как вы переместите состояние страницы в состояние просмотра, вы все равно увидите элемент __Viewstate на своих страницах.

Кроме того, я считаю, что это решение может быть более правильным, чем другие, предлагаемые, поскольку он немного обращается к кнопке "Назад" . Когда вы храните ViewState в скрытой переменной, она становится частью HTML и поэтому доступна, если пользователь нажимает кнопку "Назад" на 2 или 3 страницы и продолжает то, что он делал. Слепое разбиение ViewState с каждым запросом страницы не позволит кнопке "Назад" вести себя так, как ожидает пользователь.

Однако было бы упущено отметить, что это, вероятно, не очень хорошая идея. Сначала я предлагаю сделать по крайней мере две вещи:

Во-первых, убедитесь, что вы отключили Viewstate на всех элементах управления, которые ему не нужны (вероятно, большинство из них). Вы можете сделать это, установив для параметра IsViewstateEnabled значение false.

Во-вторых, включите сжатие http на своем веб-сервере. Даже если у вас достаточно размерное представление, общий вес страницы (при сжатии - не в браузере) должен быть относительно небольшим.

Надеюсь, что это поможет!

Ответ 2

То, что вы видите в скрытом поле ViewState, - это ControlState, которое хранится иначе, чем "нормальное" ViewState.

Чтобы также сохранить ControlState в сеансе, добавьте следующую запись в файл web.config:

  <system.web>
    <browserCaps>
      <case>
        RequiresControlStateInSession=true
      </case>
    </browserCaps>
  </system.web>

Отметьте эту страницу для более подробной информации.

Ответ 3

Важной частью кода является

protected override PageStatePersister PageStatePersister
{
    get
    {
        return new SessionPageStatePersister(this);
    }
}

Это переопределяет постоянное состояние состояния страницы и предоставляет тот, который сохраняет данные страницы для сеанса вместо ViewState.

Ответ 4

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

Я применил блокировку отражения, описанную в https://connect.microsoft.com/VisualStudio/feedback/Workaround.aspx?FeedbackID=240686, и построил собственный собственный диспетчер сеансов и сохранил все данные сеанса.

После того, как создатель WYSIWYG создал плохой HTML, я переключился на ручную запись всего своего HTML с помощью Response.Write.

Престо больше нет проблем. Много работы, но это того стоило.

РЕДАКТИРОВАТЬ: нет справедливого downvoting ниже 0, потому что вам не нравится идея игнорировать все веб-формы. Когда инструменты не работают для меня, я их не использую. Если инструменты не работают для вас, и вы не можете заставить их работать, вы также не должны их использовать.