2009-05-22 1 views
2

Я отключил viewstate в файле web.config (и на странице не существует EnableViewState = true), но, несмотря на это, страницы отображаются с довольно большим представлением (8k для страницы 40k). Я проверил содержимое viewstate с помощью viewstate decoder и обнаружил, что элементы управления мультивизом, которые я использую на своих страницах, являются виновными. В любом случае, чтобы заставить элементы управления multiview перестать использовать viewstate?ViewState занимает 20% моих страниц, хотя он отключен!

Я думаю о создании класса управления, который наследует от MultiView и переопределяет методы LoadViewState и SaveViewState, но я оставляю это в качестве крайней меры, любые предложения?

Благодаря

+0

Вы всегда можете использовать MVC, тогда вам не понадобится ViewState;) – Kezzer

+0

Я уже планировал перейти на MVC, но уже слишком поздно для проекта, над которым я работаю, он почти закончен. –

ответ

3

Поскольку ASP.NET 2.0 внутреннее содержание ViewState скрытое поле состоит из «старого» ViewState (ViewState мешковое/словаря) и ControlState. Состояние управления в отличие от ViewState не может быть отключено, и оно предназначено для минимальной информации о том, что элемент управления должен функционировать должным образом.

Вы не можете отключить ControlState, и вы либо живете с ним, либо используете другой (вид) управления на своей странице.

4

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

сжатие сэкономит вам немного с точки зрения пропускной способности, тогда как ввод с получением ViewState из страницы будут иметь весьма существенное улучшение производительности

следующие статьи объясняет несколько методов с метриками измерения производительности, а eggheadcafe

+0

Спасибо за предложение, но на самом деле я пытаюсь полностью избавиться от viewstate –

+0

. Вы можете просто остановить отображение поля viewstate полностью, используя метод, указанный в опубликованной статье i. Я думаю, asp.net всегда будет генерировать поле viewstate, даже если вы его отключили, для некоторой минимальной информации. – Vikram

0

В Класс System.Web.UI.Page имеет свойство, называемое PageStatePersister, которое вы можете переопределить на своих страницах. Здесь вы можете вернуть объект типа StStatePersister, который переопределяет режим сохранения по умолчанию для окна просмотра страниц.

Как предложил Викрам, вы можете использовать SessionPageStatePersister для хранения viewstate в сеансе вместо скрытого поля. Но вы также можете реализовать свой собственный PageStatePersister, который хранит представление в кэше или в базе данных или в файле. Что бы вы ни делали.

То, что вам не следует делать, - это использовать экран PageStatePersister для сброса видового пространства, поскольку некоторые элементы управления должны иметь вид viewstate.

+0

ViewState (или ControlState) необходимо, только если страница действительно делает обратную передачу .... – RickNZ

+0

Хорошая точка. В большинстве случаев ваши страницы будут делать postback, я думаю, но если вы можете избежать этого, вы можете полностью отключить ViewState. –

1

Чтобы ответить на мой собственный вопрос, мне удалось избавиться от вида view, удалив форму runat = "server", которая у меня была на моей главной странице, теперь я только закрываю элементы управления, которые действительно нуждаются в обратной передаче в теге формы с runat = сервер. Кажется, что отбрасывает и контрольное состояние (это то, что я хочу, страница не отправляет обратно), все равно придется расследовать больше.

Единственная проблема заключается в том, что когда я добавляю тег формы runat = server в любом месте страницы, Multiview находит мой тег формы и добавляет его мусор в скрытое поле viewstate, я думал, что это произойдет, только если multiview заключен в тег runat = "server" формы, но он достаточно умен (или достаточно глупый в этом отношении), чтобы найти тег формы в любом случае.

2

Вы можете переопределить рендер для своей страницы (или базовой страницы) для поиска скрытого ввода в виде viewstate и удалить его из записи.

шаги:

  • сделать в base.render
  • вывода содержимого htmlwriter в строку
  • удалить вход с __VIEWSTATE
  • записать новую строку в HTMLWriter.