Я хочу сохранить состояние просмотра определенной страницы в сеансе, но следующий блок кода мне не помогает. Что мне может не хватать?
Итак, вот содержимое файла кода программной части моей страницы;
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);
}
}
}





Важная часть кода
protected override PageStatePersister PageStatePersister
{
get
{
return new SessionPageStatePersister(this);
}
}
Это отменяет обычное сохранение состояния страницы и обеспечивает сохранение данных страницы в сеансе вместо ViewState.
Проблема в том, что все, что он сделал, правильно, если он не разместит больше, он может просто неправильно использовать ViewState. Я хотел убедиться, что пользователь поисковой системы не оступится и не сочтет то, что он сделал, неправильно.
привет еще раз, извините за то, что меня не интересует вопрос. Во-первых, я сделал то же самое, как видно из кода. Мне нужно еще кое-что сделать, чтобы ...
Обратите внимание, что даже после того, как вы переместите состояние страницы в состояние просмотра, вы все равно будете видеть элемент __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. Это также будет больше соответствовать тому, как работают другие программисты, если кому-то еще нужно работать на вашем сайте.
По-прежнему генерирует теги, такие как <BR />, что неверно в HTML 4.01.
В скрытом поле ViewState вы можете увидеть ControlState, который хранится не так, как «нормальный» ViewState.
Чтобы также сохранить ControlState в сеансе, добавьте следующую запись в файл web.config:
<system.web>
<browserCaps>
<case>
RequiresControlStateInSession=true
</case>
</browserCaps>
</system.web>
Проверьте эта страница для получения дополнительной информации.
M4N: спасибо за ответ, ControlState заняла оставшуюся часть поля __VIEWSTATE!
Я очень надеюсь, что этот парень не получит награду только за то, что осветил проблему.