Может ли любое тело объяснить, когда использовать
- TempData
- ViewBag
- ViewData
У меня есть требование, когда мне нужно установить значение в контроллере один, этот контроллер будет перенаправлять на контроллер два, а контроллер два будет отображать представление.
Я пытался использовать ViewBag, значение теряется, когда я достигаю второго контроллера.
Могу ли я знать, когда использовать и преимущества или недостатки?
Спасибо
asp.net-mvc-3
Хари Гиллала
источник
источник
Ответы:
Позволяет хранить данные, которые выживут для перенаправления. Внутренне он использует Сессию в качестве резервного хранилища, после перенаправления данные автоматически удаляются. Шаблон следующий:
Позволяет хранить данные в действии контроллера, которое будет использоваться в соответствующем представлении. Это предполагает, что действие возвращает представление и не перенаправляет. Живет только во время текущего запроса.
Шаблон следующий:
и в представлении:
или с ViewData:
и в представлении:
ViewBag
это просто динамическая оболочкаViewData
и существует только в ASP.NET MVC 3.При этом ни одна из этих двух конструкций никогда не должна использоваться. Вы должны использовать модели представления и строго типизированные представления. Таким образом, правильный шаблон выглядит следующим образом:
Посмотреть модель:
Действие:
Строго типизированное представление:
После этого краткого вступления давайте ответим на ваш вопрос:
и соответствующий вид (
~/Views/Two/Index.cshtml
):Есть также недостатки использования TempData: если пользователь нажмет F5 на целевой странице, данные будут потеряны.
Лично я не использую TempData. Это потому, что внутри он использует Сессию, и я отключаю сессию в своих приложениях. Я предпочитаю более RESTful способ достичь этого. Что: в первом действии контроллера, которое выполняет перенаправление, сохраните объект в вашем хранилище данных и используйте сгенерированный уникальный идентификатор при перенаправлении. Затем на целевом действии используйте этот идентификатор для извлечения первоначально сохраненного объекта:
Представление остается тем же.
источник
ViewBag.Title
свойство для всех моих видов, которое используется в моем_Layout.cshtml
файле базового вида. Другой случай, когда я использую его, - это предоставление пользователям информационных сообщений (например, «Продукт успешно сохранен!»). Я поместил некоторую общую разметку,Layout.cshtml
чтобы отобразить сообщение, если оно есть, и это позволяет мне устанавливатьViewBag.Message
любое действие. Использование свойства ViewModel в любом случае имеет слишком много недостатков.ViewBag
. Пожалуйста, опишите конкретный, реальный сценарий, когда ViewBag имеет некоторое использование. Поскольку вы говорите, что это так, я цитирую мощный ресурс , я думаю, у вас есть несколько конкретных случаев, когда этот мощный ресурс является мощным . Поскольку я никогда не использовал его в своей карьере, я был бы очень рад узнать, как люди используют это мощное оружие.ASP.NET MVC предлагает нам три варианта ViewData, ViewBag и TempData для передачи данных из контроллера для просмотра и в следующем запросе. ViewData и ViewBag почти одинаковы, а TempData выполняет дополнительную ответственность. Давайте обсудим или получим ключевые моменты по этим трем объектам:
Сходства между ViewBag и ViewData:
Разница между ViewBag и ViewData:
Пример ViewBag & ViewData:
Ввиду:
TempData:
TempData также является словарем, производным от класса TempDataDictionary и хранящимся в течение короткого сеанса, и является строковым ключом и значением объекта. Разница в том, что жизненный цикл объекта. TempData хранит информацию для времени HTTP-запроса. Это значит только с одной страницы на другую. Это также работает с перенаправлением 302/303, поскольку оно находится в том же HTTP-запросе. Помогает поддерживать данные при переходе с одного контроллера на другой контроллер или с одного действия на другое действие. Другими словами, когда вы перенаправляете, «TempData» помогает поддерживать данные между этими перенаправлениями. Он внутренне использует переменные сеанса. Использование временных данных во время текущего и последующего запроса означает, что они используются только тогда, когда вы уверены, что следующий запрос будет перенаправлен на следующий просмотр. Требуется приведение типов для сложного типа данных и проверка на нулевые значения, чтобы избежать ошибки.
Последний механизм - это Session, который работает как ViewData, как Dictionary, который принимает строку для ключа и объект для значения. Этот файл сохраняется в cookie-файле клиента и может использоваться гораздо дольше. Кроме того, необходимо больше проверки, чтобы никогда не иметь никакой конфиденциальной информации. Что касается ViewData или ViewBag, вы должны использовать его разумно для производительности приложений. Потому что каждое действие проходит весь жизненный цикл регулярного запроса asp.net mvc. Вы можете использовать ViewData / ViewBag в своем дочернем действии, но будьте осторожны, чтобы не использовать его для заполнения несвязанных данных, которые могут загрязнить ваш контроллер.
источник
TempData
По сути, это как DataReader, после прочтения данные будут потеряны.
Проверьте это видео
пример
Если вы обратите внимание на приведенный выше код, RedirectToAction не будет влиять на TempData до тех пор, пока TempData не будет прочитана. Таким образом, после прочтения TempData значения будут потеряны.
Как я могу сохранить TempData после прочтения?
Проверьте выходные данные в Тесте метода действия 1 и Тесте 2
Если вы обратите внимание на приведенный выше код, данные не будут потеряны после RedirectToAction, а также после чтения данных, и причина в том, что мы используем
TempData.Keep()
. в том, чтоТаким образом, вы можете сделать так, чтобы оно сохранялось столько, сколько вы хотите в других контроллерах.
ViewBag / ViewData
Данные будут сохранены в соответствующем представлении
источник
TempData в Asp.Net MVC является одной из очень полезных функций. Он используется для передачи данных из текущего запроса в последующий запрос. Другими словами, если мы хотим отправлять данные с одной страницы на другую, когда происходит перенаправление, мы можем использовать TempData, но нам нужно уделить некоторое внимание коду для достижения этой функции в MVC. Потому что срок действия TempData очень короткий и лежит только до полной загрузки целевого представления. Но мы можем использовать метод Keep () для сохранения данных в TempData.
Читать далее
источник
ViewBag, ViewData, TempData и View State в MVC
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
ASP.NET MVC предлагает нам три варианта ViewData, VieBag и TempData для передачи данных из контроллера для просмотра и в следующем запросе. ViewData и ViewBag почти одинаковы, а TempData выполняет дополнительную ответственность.
Сходства между ViewBag и ViewData:
Разница между ViewBag и ViewData:
Пример ViewBag & ViewData:
В представлении мы называем, как показано ниже:
TempData:
Единственный сценарий, где использование TempData будет надежно работать, - это когда вы перенаправляете. Это происходит потому, что перенаправление убивает текущий запрос (и отправляет HTTP-код состояния 302 Объект, перемещенный клиенту), а затем создает новый запрос на сервере для обслуживания перенаправленного представления.
Требуется приведение типов для сложного типа данных и проверка на нулевые значения, чтобы избежать ошибки.
источник
источник
TempData будет всегда доступен до первого чтения, после того как вы прочитаете его, он больше не будет доступен, может быть полезно также передать быстрое сообщение, чтобы просмотреть, что будет пропущено после первого чтения. ViewBag Более полезно при быстрой передаче фрагмента данных в представление, обычно вы должны передавать все данные в представление через модель, но есть случаи, когда вы моделируете поступление непосредственно из класса, который отображается в базу данных, как структура сущностей, в этом случае вы не используете Что бы изменить вашу модель, чтобы передать новый фрагмент данных, вы можете вставить это в viewbag ViewData это просто индексированная версия ViewBag и использовалась до MVC3
источник
Кроме того, область видимости отличается между viewbag и temptdata. viewbag основан на первом представлении (не разделяемом между методами действия), но temptdata может быть разделена между методом действия и только между собой.
источник