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


Я использую AcceptVerbs метод подробно описан в блоге Скотта ГУ Preview 5 для работы с записями формы в ASP.NET MVC:

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

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

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

это вообще обоснованное беспокойство, или я это выдумываю?

8 94

8 ответов:

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

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

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

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

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

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

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

  1. вы не используете сессии на вашем сайте прямо сейчас
  2. у вас есть система, которая должна масштабироваться до высокой пропускной способности, т. е. вы предпочитаете избегать состояния сеанса вообще
  3. вы не хотите использовать cookies (я не знаю, насколько хорошо MVC поддерживает cookieless сессии прямо сейчас)

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

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

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

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

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

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

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

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

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

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

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

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

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

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