Сохранение ViewState в SessionPageStatePersister - PullRequest
10 голосов
/ 22 декабря 2008

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

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

    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);
            }
        }
    }

Ответы [ 4 ]

9 голосов
/ 28 января 2009

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

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

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

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

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

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

4 голосов
/ 03 февраля 2009

В скрытом поле ViewState вы можете видеть ControlState, который хранится не так, как «обычный» ViewState.

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

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

Проверьте эту страницу для более.

3 голосов
/ 27 января 2009

Важная часть кода

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

Это переопределяет сохранение обычного состояния страницы и обеспечивает сохранение данных страницы в сеансе вместо ViewState.

2 голосов
/ 28 января 2009

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

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

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

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

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

...