Назначение DataTable для ViewState-это хороший способ?


Я получаю DataTable из базы данных и назначаю ViewState, как показано ниже: потому что я не хочу каждый раз попадать в базу данных.

DataTable dt = GetDataTable();
ViewState["dtTable"] = dt;

GetDataTable() это метод, который извлекает 1000 записей из базы данных. Это лучший способ или какой из них является лучшим способом справиться с этим?

5 4

5 ответов:

Прежде всего: помимо объяснений, это все еще во многом зависит от ваших требований, настроек среды ...

Viewstate хранится в скрытом поле, отображаемом как тег <input /> в конечном HTML-файле, отправленном в браузер. Когда пользователь инициирует обратную передачу (щелчок кнопки и т. д..), данные отправляются обратно на сервер в составе представленных данных формы.

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

Кроме того, состояние просмотра легко теряется. Он сохраняется только до тех пор, пока пользователь отправляет форму. Если пользователь нажимает гиперссылку на другую страницу, форма не отправляется и, следовательно, данные, содержащиеся в ViewState, теряются.

Рекомендуется использовать ViewState is, если данные относительно малы.

Если мы рассмотрим параметры безопасности, данные ViewState кодируются в base64, который может быть легко декодирован. Это классический пример взлома веб-сайта, поэтому проверьте, какие именно данные вы храните. Хотя вы можете преодолеть эту проблему, установив EnableViewStateMac в true.

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

Кроме того, данные в сеансе фактически присутствуют на веб-сервере между загрузками страниц. Это помогает сохранить размер страницы небольшим,он должен использовать только идентификатор сеанса.

Последний вариант-использовать кэширование.Проверка MSDN здесь для лучших практик на Кэширование.

Просмотр побочных эффектов состояния

1) он сериализуется во входное значение и десериализуется на обратном пути.

2) viewstate хранится в скрытом теге на форме. Когда пользователь инициирует обратную передачу (например, нажав кнопку), данные возвращаются на сервер как часть данных формы. Это может замедлить ход событий.

3) ViewState легко теряется. Он сохраняется только до тех пор, пока пользователь отправляет форму. Если пользователь нажимает гиперссылку на другую страницу, то форма никогда не отправляется, и все данные, содержащиеся в ViewState, теряются. Это верно, даже если тег привязки указывает на страницу, на которой в данный момент находится пользователь.

Я бы использовал ASP.NET кэш для хранения этих таблиц данных по следующим причинам.

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

2)кэш будет автоматически удален, если процессы памяти "давление" слишком высокий.

3) Вы можете сделать кэшированный элемент специфичным для одного пользователя или глобальным для всех пользователей на основе его ключа

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

Использование DataTable будет работать. Однако DataTable в основном является динамическим объектом, и код в представлении, как правило, трудно отлаживать.

Я бы предложил создать класс или структуру, которая содержит нужные вам свойства.Затем преобразуйте DataTable в список экземпляров этого класса и отправьте его в представление.

Это сделает код более читаемым, потому что теперь любой программист может видеть, какие данные вы пытаетесь извлечь. И это избавит вас от необходимости отлаживать смотреть много.

Состояние просмотра-это хороший способ хранения таблицы данных в состоянии просмотра

Хранить таблицу данных в viewstate DataTable dt=новый DataTable(); ViewState ["dttable"]=dt;

А теперь данные ViewState в Datatable

DataTable dtnin=(DataTable)ViewState ["dttable"];