Поиск…


Вступление

ViewData и ViewBag используются для передачи данных с контроллера для просмотра.

ViewData - это не что иное, как словарь объектов, а доступ к нему - как строка.

ViewBag очень похож на ViewData. ViewBag - динамическое свойство. ViewBag - это всего лишь оболочка вокруг ViewData.

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

Синтаксис

  1. ViewData [ключ] = значение;

  2. ViewBag.Key = значение;

  3. 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 сохраняя значение, зависит от дополнительной логики.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow