Что лучше в этом сценарии? ViewBag или TempData или Session?
Я создал новостной сайт в MVC
, У меня есть функция поиска на нем.
когда Index
Action
из Search
Controller
называется, он выбирает записи из database
, это возвращает Search View.
Этот вид поиска имеет AJAX Pager
для пейджинга, когда нажата следующая или предыдущая кнопка пейджера, AJAX
запрос сделан Paging Action
из Search Controller
,
Теперь я не хочу снова звонить моим Database
, Я хочу использовать результаты, которые были получены во время Index action
из Search Controller
,
Сейчас я использовал Session[""]
объект.
Я хочу знать, что лучше использовать для управления состоянием в этом сценарии.
Результаты, полученные из базы данных, могут быть около 1000-5000, ArticleName
, ArticleShortDescription
(~ 200 символов)
3 ответа
Вы не должны использовать ни один из них. Сеансы создаются для каждого пользователя. Если вы сохраняете 1000 - 5000 статей для каждого пользователя, используя ваш поиск, у вас будет плохое время. ViewData - это, по сути, объект Session с красивыми обертками, так что это также плохо для вашего варианта использования.
Допустим, вы решили вместо этого использовать HttpRuntime.Cache, чтобы не помещать весь результат для каждого пользователя, а затем вам нужно беспокоиться о том, как долго хранить объекты в кеше.
Логическим подходом будет запрос к базе данных с нумерацией страниц
Чтобы предотвратить частое попадание в вашу базу данных, вам следует кэшировать результаты поиска по страницам с помощью критерия поиска + номер страницы + размер страницы (необязательно) в качестве ключа кэша и сохранять объекты результатов в качестве значения кэша, в идеале с установленным сроком действия кэша. (Вы не хотите показывать устаревшие результаты поиска, пока ваш кеш не будет удален, верно?)
ViewBag
или же ViewData
сохраняются только в текущем запросе. Как таковые, они не могут быть использованы.TempData
сохраняется до следующего запроса, но это может быть что угодно, поэтому нет гарантии, что он будет сохраняться достаточно долго, чтобы вы могли выполнить свой вызов Ajax (или последующие вызовы Ajax).
Реально, Session
это ваш единственный достойный вариант в этом случае, хотя он все еще не оптимален. Вы будете хранить много информации, которая может даже не запрашиваться клиентом. Даже тогда, очистка его после того, как он больше не нужен, может оказаться сложной задачей.
Лучше всего было бы делать звонки в базу данных, которые учитывают подкачку страниц, поэтому вы каждый раз возвращаете только часть данных для каждого запроса, а не просто извлекаете все данные.
Я избегаю использования состояния сеанса, поскольку оно влияет на масштабирование приложения в среде с балансировкой нагрузки. Вы должны убедиться, что у пользователя всегда есть запросы, обслуживаемые с одного и того же сервера, потому что именно там хранится состояние сеанса (если вы не поместите его в базу данных, но это не решит проблему в вашей ситуации).
Я бы попробовал использовать кеширование приложений. Это означает, что если пользователь нажимает кнопку "Далее" или "Предыдущий" и этот запрос обслуживается с другого сервера, вам придется снова обращаться к базе данных - но лично я предпочел бы принять этот удар.
Посмотрите на эту страницу, в частности, прокрутите вниз до раздела " Кэширование приложений ".
Надеюсь это поможет.