Сохранение 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, потому что вам не нравится идея игнорировать все веб-формы. Когда инструменты не работают для меня, я их не использую. Если инструменты не работают для вас, и вы не можете заставить их работать, вы также не должны их использовать.