2014-10-09 3 views
1

Я создал новостной сайт в MVC. У меня есть функция поиска на нем.Что лучше в этом сценарии? ViewBag или TempData или Session?

Когда IndexAction из SearchController называется, она извлекает записи из database, он возвращает Search View. Этот поиск Просмотр имеет AJAX Pager для пейджинга, когда следующий или предыдущий кнопка Пейджер нажата, AJAX запрос к Paging Action из Search Controller.

Теперь я не хочу снова звонить на мой Database. Я хочу использовать результаты, которые были получены во время Index actionSearch Controller.

На данный момент я использовал Session[""] объект.

Я хочу знать, что лучше использовать для управления государством в этом сценарии.

Результаты выбираемые из базы данных может быть около 1000-5000, ArticleName, ArticleShortDescription (~ 200 символов)

ответ

2

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

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

Логический подход будет запроса к базе данных с пагинацией

Для предотвращения попадания базы данных так часто, то вы должны кэшировать перемещаемый результат с термином поиска + номером страницы + размером страницы (по желанию) в качестве ваш кеш-ключ и сохраните ваши объекты результатов в качестве значения кеша, в идеале с установленным сроком действия кеша. (Вы не хотели бы показывать устаревшие результаты поиска до тех пор, пока ваш кеш не будет выправлен правильно?)

+0

Когда вы говорите «запрос базы данных с разбивкой на страницы», , как я могу узнать, сколько записей соответствует моим критериям? – AK47

+0

взгляните на это http://stackoverflow.com/a/18119680/670514 –

+0

Я знаю этот подход, но что хорошего? Либо добавить один дополнительный столбец (только для одного значения), либо кеширование на стороне .Net? – AK47

2

ViewBagViewData или являются постоянными только в текущем запросе. Таким образом, они непригодны для использования. TempData сохраняется до следующего запроса, но это может быть что угодно, поэтому нет никакой гарантии, что это будет продолжаться достаточно долго, чтобы вы могли совершить свой Ajax-вызов (или последующие вызовы ajax).

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

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

+0

Спасибо за ответ, но я хочу избежать другого вызова базы данных. Приведение только записей из 1 страницы из базы данных не позволит мне применить причину пейджинга, там будут записи только с одной страницей, поэтому нет смысла применять пейджинг. – AK47

+0

Ну, в этом случае вам придется либо использовать «сессию» для пользовательских данных, либо «кэш приложений» для глобальных/общедоступных данных, как упоминается @fordio – Kippie

1

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

Я бы попытался использовать кеширование приложений. Это означает, что если пользователь нажимает «Далее» или «Пред», и этот запрос будет подан с другого сервера, вам придется снова обратиться в базу данных, но лично я предпочел бы воспользоваться этим ударом.

Посмотрите на this page, в частности прокрутите вниз до Кэширование приложений раздел.

Надеюсь, это поможет.

Смежные вопросы