На зміну жаху і нерозуміння приходить бажання розібратися, як видалити 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 наступного змісту:
Тут ми переписуємо місце зберігання стану компонентів. За замовчуванням використовується HiddenFieldPageStatePersister (це наше приховане поле ViewState на сторінці). Ми ж замінюємо його на SessionPageStatePersister, тобто вказуємо, що тепер ми будемо зберігати стан уявлення ASP.NET-сторінки на веб-сервері.
Тепер потрібно, щоб наші сторінки дізналися, що у них є такий PageAdapter. Для цього в каталозі App_Browsers нашого сайту створюємо файлик BrowserFile.browser наступного змісту:
Файл з розширенням .browser в загальному випадку призначений для того, щоб визначити можливості браузера. Наприклад, щоб дати різні версії сайтів настільним і мобільним браузерам. Адаптери можуть використовувати дані з цього файлу для адаптації своєї поведінки. Що ми, власне, і зробили.
Ось, в принципі, і все! Тепер всі дані про стан подання сторінок зберігаються в сесії на сервері веб-додатки.
1. За допомогою точкового відключення властивості EnableViewState у контролів, що не змінюють свій стан при PostBack, можна скоротити обсяг захаращувати інформації в прихованому полі ViewState на сторінці.
2. За допомогою перенесення зберігання стану контролів з клієнтської сторінки на сервер можна домогтися істотного скорочення ваги сторінок. Запис в 200 Кб скорочується до лаконічного
Вам також може бути цікаво: