Как пользовательский ASP.NET может управлять данными кэша без использования ViewState?

Я не уверен, что это возможно в ASP.NET, но вот проблема, с которой я столкнулся: некоторые списки данных в моем веб-приложении отображаются с помощью GridView; однако, поскольку некоторые из этих списков могут содержать много данных, они иногда увеличивают вес страницы до нескольких мегабайт из-за ViewState. Поскольку мы не хотим запрашивать эту информацию в базе данных каждый раз, когда на странице происходит обратная передача, мне было интересно, есть ли способ кэшировать данные, переданные элементу управления на сервере, а затем получить к ним доступ в следующий раз есть постбэк.

Так это вообще возможно? Если да, то может ли кто-нибудь указать мне направление дополнительной информации о том, как это сделать? Если это невозможно, есть ли у кого-нибудь предложения о том, как я могу решить эту проблему?


person rjzii    schedule 24.02.2009    source источник


Ответы (4)


Вы можете использовать другое хранилище для своего состояния просмотра, кроме страницы. В этой статье описаны некоторые методы для этого.

Суть этого заключается в переопределении SavePageStateToPersistenceMedium и LoadPageStateFromPersistenceMedium.

person Jeff Martin    schedule 24.02.2009
comment
Будьте осторожны с перегрузками SavePageStateToPersistenceMedium и LoadPageStateFromPersistenceMedium. Они ломаются при использовании элемента управления asp.net ajax ‹asp:UpdatePanel /›. Это сильно обожгло нас на большом проекте. - person andleer; 24.02.2009
comment
@Andrew - Мы используем много ASP.NET Ajax в этом приложении, такой перерыв был бы плохой вещью ™ - person rjzii; 24.02.2009

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

http://www.pluralsight.com/main/screencasts/screencast.aspx?id=understanding-viewstate

EnableViewState="false"

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

http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx

<%@ Page Language="C#" AutoEventWireup="true" ... %>
<%@ OutputCache ... %>
person andleer    schedule 24.02.2009
comment
Пользовательский GridView, над которым я работаю, будет предназначен для представлений только для чтения, поэтому отсутствие доступа к редактированию не является проблемой. Тем не менее, одна из вещей, которую мы пытаемся разрешить, — это быстрое применение сортировки к набору данных, и прямо сейчас кэширование всего в DataTable на стороне сервера выглядит как... - person rjzii; 24.02.2009
comment
... лучший способ делать вещи. Тем не менее, я все еще не уверен, что это лучший способ, учитывая наши обстоятельства. - person rjzii; 24.02.2009

Вот пример того, как вы можете сохранить Viewstate в локальных временных файлах: ="nofollow noreferrer">http://www.marklio.com/marklio/PermaLink.aspx?guid=af76f1a0-2d44-44c3-bfb5-029740b8e683

Вы все еще используете Viewstate с этим подходом, но вместо заполнения HTML вы создаете временные файлы на стороне сервера. Таким образом, пользователь не заметит, что Viewstate огромен. Вы также можете переписать приведенный выше пример, чтобы хранить данные Viewstate в другом месте, например в базе данных или даже в памяти.

Преимущество этого подхода в том, что вам не придется переписывать много кода. Недостатком является то, что эти временные файлы будут занимать место на сервере и время от времени их необходимо очищать.

person Thomas Petersen    schedule 24.02.2009

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

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

Если вы не можете рассчитывать на сеанс для кэширования, всегда есть альтернативные механизмы сохранения, которые могут выполнить эту работу.

Но с точки зрения дизайна данной ситуации я бы определенно выбрал подход к кэшированию данных.

person ljubomir    schedule 24.02.2009