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

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

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

    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);
            }
        }
    }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
10 270
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

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

Я очень надеюсь, что этот парень не получит награду только за то, что осветил проблему.

Joshua 30.01.2009 06:45

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

Nick Berardi 30.01.2009 15:04

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

yusuf 01.02.2009 12:58
Ответ принят как подходящий

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

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

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

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

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

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

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

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

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

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

Обновлено: нет справедливого отрицательного голосования ниже 0, потому что вам не нравится идея игнорировать все веб-формы. Когда инструменты мне не подходят, я их не использую. Если инструменты не работают для вас и вы не можете заставить их работать, вам тоже не следует их использовать.

Возможно, вам будет проще поддерживать, если вы используете элементы управления Html (из System.Web.UI.HtmlControls) и установите для них EnableViewState значение false. Это также будет больше соответствовать тому, как работают другие программисты, если кому-то еще нужно работать на вашем сайте.

tsimon 29.01.2009 07:20

По-прежнему генерирует теги, такие как <BR />, что неверно в HTML 4.01.

Joshua 29.01.2009 19:16

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

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

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

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

M4N: спасибо за ответ, ControlState заняла оставшуюся часть поля __VIEWSTATE!

user673635 23.03.2011 21:17

Другие вопросы по теме