назад к списку статей

Как удалить ViewState со страницы

VieState deleteЗа что разработчики недолюбливают Asp.Net, так это за огромные объемы страниц. Состояние серверных компонентов хранится прямо на странице в скрытом поле ViewState, удалить которое без ощутимых последствий, на первый взгляд, не представляется возможным. Наиболее «жирные» страницы могут хранить в нем мегабайты данных.

На смену ужасу и непониманию приходит желание разобраться, как удалить ViewState или, как минимум, сократить объем хранящейся в нем информации?

К сожалению, содержимое Asp.Net-страниц не поддается ручному формированию. И это вызывает огромное негодование у некоторых разработчиков. Например, в том же PHP программист полностью формирует содержимое страницы, контролируя каждый символ. Кстати, в Asp.Net MVC такого безобразия, как ViewState, уже нет.

Давайте разберемся, зачем нужен ViewState, и что в нем хранится? Поехали!

  • ViewState хранит данные о всех серверных контролах. Все свойства контрола, у которого runat="server" хранятся там;

  • ViewState отслеживает изменение состояния серверных компонентов;

  • При перезагрузке страницы восстанавливает состояние компонентов;

  • Все данные хранятся в сериализованном виде в скрытом поле прямо на странице.

Из всего вышесказанного, очевидно, что ViewState – полезная штука, и его грубое отключение приведет к тому, что после перезагрузки страницы контролы перестанут сохранять введенную в них информацию, все измененные свойства будут заменены дефолтными. В общем, играться здесь нужно очень осторожно.

Удаление ViewState можно провести двумя способами:

  • убрать ViewState у контролов, не хранящих информацию о своем состоянии;

  • перенести хранения состояния из скрытого поля ViewState на сервер приложения.

Давайте подробнее рассмотрим каждый способ.

Удаление ViewState с помощью свойства EnableViewState

В Asp.Net у каждого серверного контрола есть свойство EnableViewState. По умолчанию оно равно true. Это означает, что элемент хранит свое состояние в поле ViewState на странице. Если в свойствах контрола проставить EnableViewState="false", то его состояние перестанет храниться. Например, если у вас на станице есть Label, который при PostBack не меняет своих свойств, то ему можно и даже нужно отключить ViewState.

Осторожно играйтесь с этим свойством, иначе при PostBack можно потерять текущее состояние контрола.

Примечание. Можно отключить ViewState на уровне страницы, поставив в теге Page атрибут EnableViewState="false". Тогда скрытое поле ViewState вообще исчезнет со страницы, а все контролы перестанут хранить данные о своем состоянии.

Перенести хранения состояния из поля ViewState на сервер приложения

Этот способ мне нравится больше, т.к. по сути мы ничего не отключаем, а просто изменяем место хранения информации о состоянии серверных компонентов. Будем менять поведение страницы с помощью класса PageAdapter из сборки System.Web.UI.Adapters.

Пару строк о том, что такое Адаптер страницы? Это надстройка над стандартным обработчиком страниц, которая позволяет переопределять поведение страницы.

В нашем веб-приложении создадим класс MyPageAdapter.cs со следующим содержимым:

using System.Web.UI;
public class MyPageAdapter : System.Web.UI.Adapters.PageAdapter
{
  public override PageStatePersister GetStatePersister()
  {
    return new SessionPageStatePersister(Page);
  }
}

Здесь мы переписываем место хранения состояния компонентов. По умолчанию используется HiddenFieldPageStatePersister (это наше скрытое поле ViewState на странице). Мы же заменяем его на SessionPageStatePersister, т.е. указываем, что теперь мы будем хранить состояние представления ASP.NET-страницы на веб-сервере.

Теперь нужно, чтобы наши страницы узнали, что у них есть такой PageAdapter. Для этого в каталоге App_Browsers нашего сайта создаем файлик BrowserFile.browser со следующим содержимым:

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.Page" adapterType="MyPageAdapter" />
    </controlAdapters>
  </browser>
</browsers>

Файл с расширением .browser в общем случае предназначен для того, чтобы определить возможности браузера. Например, чтобы дать разные версии сайтов настольным и мобильным браузерам. Адаптеры могут использовать данные из этого файла для адаптации своего поведения. Что мы, собственно, и сделали.

Вот, в принципе, и все! Теперь все данные о состоянии представления страниц хранятся в сессии на сервере веб-приложения.

Выводы

1. С помощью точечного отключения свойства EnableViewState у контролов, не изменяющих свое состояние при PostBack, можно сократить объем захламляющей информации в скрытом поле ViewState на странице.

2. С помощью переноса хранения состояния контролов с клиентской страницы на сервер можно добиться существенного сокращения веса страниц. Запись в 200 Кб сокращается до лаконичного

asp.net viewstate

Если у вас есть желание поглубже изучить все прелести ViewState, есть отличная статья на Хабре.

Вам также может быть интересно:

Установка Asp.Net и регистрация в IIS

Установка и настройка IIS 5.1 на Windows XP

Установка и настройка IIS 6 на Windows 2003

Установка и настройка IIS 7 на Windows 2008

назад к списку статей


I'mon Google+ .