ASP.NET MVC - TempData - Хорошая или плохая практика

Я использую метод AcceptVerbs, подробно описанный в блоге Scott Gu Preview 5 для работы с записями форм в ASP.NET MVC:

  • Пользователь получает пустую форму через GET
  • Пользователь вводит заполненную форму через POST в одно действие
  • Действие проверяет данные, предпринимает соответствующие действия и перенаправляет на новый вид

Поэтому мне не нужно использовать TempData. Тем не менее, теперь я должен добавить шаг подтверждения к этому процессу, и, похоже, это требует использования TempData.

По какой-то причине у меня есть отвращение к использованию TempData - что это то, что нужно создать вокруг.

Является ли это вообще серьезной проблемой, или я это делаю?

Ответ 1

Мне кажется, что временные данные являются механизмом "огонь-и-забыть" для уведомления пользователя. Это здорово дать им напоминание о том, что они недавно сделали, но я также не решаюсь сделать это необходимым шагом в каком-то пользовательском процессе. Причина в том, что если они обновят страницу, я верю, что она исчезнет. Ну, я думаю, я тоже не решаюсь использовать его, поскольку он не очень хорошо определен, насколько он надежный.

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

Ответ 2

Не нужно проявлять отвращение к TempData... Но если оно не используется правильно, это, безусловно, может свидетельствовать о плохом дизайне. Если вы используете URL-адрес RESTful, TempData - лучшая практика для передачи сообщений из ваших POST-действий в ваши действия GET. Рассмотрим это:

У вас есть форму в URL Products/New. Форма "Посты для продуктов/создания", которая проверяет форму и создает продукт, "Успех" переадресовывает контроллер на продукты URL-адреса/1 и при ошибке перенаправляет обратно на продукты/ "Новый", чтобы отображать сообщения об ошибках.

Продукты/1 - это просто стандартное действие GET для продукта, но мы хотели бы, чтобы сообщение отображалось с указанием, что вставка прошла успешно. TempData идеально подходит для этого. Добавьте сообщение в TempData в Post Controller и поместите некоторую логику в представление и сделанное.

В случае сбоя я добавлял значения, введенные в formCollection, и коллекцию сообщений об ошибках в TempData в действии Post и перенаправляя их к intial Action Prodcuts/New. Я добавил логику в представление, чтобы заполнить входы формы с ранее введенными значениями вместе с любыми сообщениями об ошибках. Кажется приятным и чистым для меня!

Ответ 3

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

  • Вы не используете сеансы на своем сайте прямо сейчас
  • У вас есть система, которая должна масштабироваться до высокой пропускной способности, т.е. вы предпочитаете вообще избегать состояния сеанса
  • Вы не хотите использовать файлы cookie (я не знаю, насколько хорошо MVC поддерживает cookieless-сеансы прямо сейчас)

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

Ответ 4

У меня есть метод GetModel, который сначала проверяет TempData [ "model" ] и возвращает это. В противном случае GetModel загружает соответствующие данные из базы данных.

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

Ответ 5

Зайдите в бесконтактные контроллеры в MVC3. Оказалось, что использование сеанса предотвращает параллельное выполнение одного пользовательского запроса и, таким образом, приводит к снижению производительности.

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

Ответ 6

Это похоже на использование ViewData, что означает, что это, вероятно, не риск для безопасности. Но я бы предпочел использовать ViewData, чем TempData. Отметьте здесь для сравнения: http://www.squaredroot.com/2007/12/20/mvc-viewdata-vs-tempdata/

В зависимости от дизайна вы всегда можете сохранить пользователь/корзину или все, что вам нужно в tempdata в базе данных, и просто иметь поле "IsReady", которое указывает, завершено ли оно или нет, что делает его расширяемым позже, если вы хотите иметь в виду, что люди могут закрыть свои браузеры.

Ответ 7

Почему у вас такое отвращение? Эта вещь просто делает свою работу и делает ее хорошо:)

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

Ответ 8

Все хорошие ответы, вы видели это для передачи сообщений.

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

При этом посмотрите на это использование TempData для передачи сообщений здесь.

http://jameschambers.com/2014/06/day-14-bootstrap-alerts-and-mvc-framework-tempdata/

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