asp.net-mvc
ViewData, ViewBag, TempData
Поиск…
Вступление
ViewData
и ViewBag
используются для передачи данных с контроллера для просмотра.
ViewData - это не что иное, как словарь объектов, а доступ к нему - как строка.
ViewBag очень похож на ViewData. ViewBag - динамическое свойство. ViewBag - это всего лишь оболочка вокруг ViewData.
TempData хранит данные на время HTTP-запроса, что означает, что он хранит данные между двумя последовательными запросами. TempData помогает нам передавать данные между контроллерами или между действиями. Внутренне использует сеанс.
Синтаксис
ViewData [ключ] = значение;
ViewBag.Key = значение;
TempData [ключ] = значение;
Что такое ViewData, ViewBag и TempData?
ViewData - это механизм для контроллера, который предоставляет данные для представления, которое он представляет, без использования ViewModel. В частности, ViewData - это словарь, который доступен как в методах и представлениях MVC. Вы можете использовать ViewData для переноса некоторых данных из вашего метода действий в представление, возвращаемое методом действия.
Поскольку это словарь, вы можете использовать словарь как синтаксис для установки и получения данных из него.
ViewData[key] = value; // In the action method in the controller
Например, если вы хотите передать строковое сообщение из метода действия индекса в индекс Index.cshtml
, вы можете это сделать.
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC";
return View(); // notice the absence of a view model
}
Чтобы получить доступ к этому в вашем представлении Index.cshtml
, вы можете просто получить доступ к словарю ViewData с помощью ключа, используемого в методе действий.
<h2>@ViewData["Message"]</h2>
ViewBag - это динамический эквивалент нетипизированного словаря ViewData. Он использует dynamic
тип C # для синтаксического опыта сахара.
Синтаксис для установки некоторых данных в ViewBag
ViewBag.Key = Value;
Поэтому, если мы хотим передать строку сообщения в нашем предыдущем примере с помощью ViewBag, это будет
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC";
return View(); // not the absence of a view model
}
и в вашем представлении индекса,
<h2>@ViewBag.Message</h2>
Данные не разделяются между ViewBag и ViewData. ViewData требует приведения типов для получения данных из сложных типов данных и проверки нулевых значений, чтобы избежать ошибки, когда в представлении сумка не требует приведения типов.
TempData может использоваться, когда вы хотите сохранить данные между одним HTTP-запросом и только следующим HTTP-запросом. Срок службы данных, хранящихся в TempDataDictionary, заканчивается после второго запроса. Поэтому TempData полезен в сценариях, где вы следуете шаблону PRG.
[HttpPost]
public ActionResult Create(string name)
{
// Create a user
// Let's redirect (P-R-G Pattern)
TempData["Message"] = "User created successfully";
return RedirectToAction("Index");
}
public ActionResult Index()
{
var messageFromPreviousCall = TempData["Message"] as String;
// do something with this message
// to do : Return something
}
Когда мы return RedirectToAction("SomeActionMethod")
, сервер отправит ответ 302 клиенту (браузеру) с значением заголовка местоположения, установленным на URL-адрес «SomeActionMethod», и браузер сделает совершенно новый запрос на это. ViewBag / ViewData не будет работать в этом случае для обмена некоторыми данными между этими двумя вызовами. Вы должны использовать TempData в таких сценариях.
Жизненный цикл TempData
Данные, сохраненные в TempData, сохраняются в сеансе и будут автоматически удалены в конце первого запроса, к которому обращаются данные. Если он никогда не читается, он будет храниться до окончательного чтения или сеанса.
Типичное использование выглядит следующим образом (где каждая строка вызывается из другого запроса):
//first request, save value to TempData
TempData["value"] = "someValueForNextRequest";
//second request, read value, which is marked for deletion
object value = TempData["value"];
//third request, value is not there as it was deleted at the end of the second request
TempData["value"] == null
Такое поведение может быть дополнительным контроллером с помощью методов Peek
и Keep
.
С помощью
Peek
вы можете извлекать данные, хранящиеся в TempData, без маркировки для удаления, поэтому данные по-прежнему будут доступны в будущем запросе//first request, save value to TempData TempData["value"] = "someValueForNextRequest"; //second request, PEEK value so it is not deleted at the end of the request object value = TempData.Peek("value"); //third request, read value and mark it for deletion object value = TempData["value"];
С помощью
Keep
вы можете указать, что ключ, который был помечен для удаления, должен быть фактически сохранен. В этом случае для извлечения данных и сохранения их из удаления требуется два вызова метода://first request, save value to TempData TempData["value"] = "someValueForNextRequest"; //second request, get value marking it from deletion object value = TempData["value"]; //later on decide to keep it TempData.Keep("value"); //third request, read value and mark it for deletion object value = TempData["value"];
Имея это в виду, используйте Peek
когда вы всегда хотите сохранить значение для другого запроса, и используйте Keep
сохраняя значение, зависит от дополнительной логики.