ASP.NET ViewState

109

Програмування Asp.net
Попередній

Наступний

На одному з співбесід запитали розповісти про ViewState, як працює, навіщо воно і т. д. Так що беремо msdn і розбираємося в понятті ViewState.

ViewState служить для збереження изменей, які були зроблені на формі після postback (навіть з назви можна здогадатися – перегляд сосотяния). Якщо ви використовуєте runat=”server” контроли, то вам потрібно обов’язково розібратися в цьому терміні, так як він може завдати шкоди в будещем (на співбесіді потрібно було працювати з ASP.NET MVC). За умолчению ViewState поміщається в hidden поле з назвою __VIEWSTATE. Це приховане поле може стати дуже великим – кілька десятків кілобайт. Повільність процесу викликає не тільки завантаження цього поля, але і коли користувач робить postback, то вміст __VIEWSTATE переробляється в html.

View State — так ASP.NET називається спосіб зберігання даних про стан сторінки в прихованому поле форми на самій сторінці. Коли форма передається від клієнта на сервер, дані з прихованого поля використовуються, щоб для конкретного клієнта встановити стан серверних об’єктів, які формують сторінку. View State дозволяє зберігати стан клієнтського web-інтерфейсу, при цьому не використовуються ні cookies (які можуть бути відключені на клієнті), ні пам’ять сервера (якої може не вистачити при роботі великої кількості користувачів). View State використовується в багатьох серверних елементів керування ASP.NET (наприклад, Даних), щоб запам’ятовувати їх поточний стан. Приклад — збереження значень полів форми на сторінці під час посторінкового гортання списків. Проте в застосуванні View State є не тільки плюси, але й мінуси. Перш за все, при використанні View State сторінка стає «важче», як для обробки, так і для передачі клієнту, з-за додаткового обсягу. Далі, додаткове навантаження пов’язана з формуванням і розбором даних прихованого поля View State. І, нарешті, для обробки View State все-таки потрібна пам’ять на сервері. Деякі серверні елементи управління, зокрема, DataGrid, здатні надзвичайно активно використовувати View State, навіть тоді, коли в цьому немає необхідності. За умовчанням параметр View State включений. У цьому-то і проблема. Ймовірно, розробники ASP.NET хотіли таким чином привернути увагу програмістів до цієї технологічної «фиче». Частково їм це вдалося. Але ті програмісти, які «не помітили» нововведення або використовують його бездумно, здатні на рівному місці породити справжніх монстрів. Звичайний сценарій такий: програміст використовує ViewState неявно, працюючи з серверними «контролами», і іноді явно, тому що цей об’єкт — зручний словник для зберігання власних даних. «Об’єднані зусилля» серверних «контролів» і програміста легко призводять до невиправданого збільшення, прихованого поля, що містить дані ViewState, так що його обсяг може перевищити обсяг сторінки в кілька разів. Час відгуку для користувача збільшується, додаток стає неповоротким». Працювати з таким додатком через Інтернет по слабкому каналу може стати просто неможливо. Далі виникає природне бажання зменшити розмір сторінки. Виявити поле View State нескладно розібратися, як його вимкнути — теж. Можна відключити на рівні елемента керування, а можна — на рівні сторінки: І тут починаються проблеми. Або починають губитися введені користувачем значення полів, зникають наші внутрішні дані, які ми зберігали в словнику View State, щоб не возитися з власними прихованими параметрами або cookies. Тепер треба «прочісувати» код формування сторінки, щоб замінити звернення до View State на щось інше, а також відловлювати моменти, коли скидаються необхідні для користувача значення «контролів». Загалом, процес розробки від таких переробок не прискорюється і надійність коду не збільшується. Звідси робимо простий висновок — не треба ігнорувати ViewState. Все, що потрібно, щоб View State був корисний, а не шкідливий, це на початку роботи над сторінкою подумати про те, як на даній сторінці оптимально використовувати цю можливість. Якщо сторінка не призначена для отримання даних від клієнта, або якщо елементи керування на ній генеруються динамічно, слід відключити View State на рівні сторінки. В інших випадках вам, можливо, знадобиться відключити View State на рівні окремих елементів управління. Не зберігайте в словнику View State об’ємні дані, і не використовуйте його як аналог «купи» для тимчасових змінних. Такі дії з великою ймовірністю приведе до проблем у майбутньому