Szukaj…


Wprowadzenie

ViewData i ViewBag służą do przesyłania danych z kontrolera do przeglądania.

ViewData to nic innego jak słownik obiektów i jest dostępny poprzez ciąg znaków jako klucz.

ViewBag jest bardzo podobny do ViewData. ViewBag to dynamiczna właściwość. ViewBag to tylko opakowanie wokół ViewData.

TempData przechowuje dane na czas żądania HTTP, co oznacza, że przechowuje dane między dwoma kolejnymi żądaniami. TempData pomaga nam przenosić dane między kontrolerami lub między działaniami. Wewnętrznie korzysta z sesji.

Składnia

  1. ViewData [klucz] = wartość;

  2. ViewBag.Key = wartość;

  3. TempData [klucz] = wartość;

Co to są ViewData, ViewBag i TempData?

ViewData to mechanizm umożliwiający kontrolerowi dostarczanie danych do prezentowanego widoku bez użycia ViewModel. W szczególności ViewData to słownik dostępny zarówno w metodach akcji MVC, jak i widokach. Możesz użyć ViewData, aby przenieść niektóre dane z metody akcji do widoku zwróconego przez metodę akcji.

Ponieważ jest to słownik, można go używać, np. Składni, do ustawiania i pobierania danych z niego.

ViewData[key] = value; // In the action method in the controller

Na przykład, jeśli chcesz przekazać ciąg znaków z metody akcji Index do widoku indeksu Index.cshtml , możesz to zrobić.

public ActionResult Index()
{
   ViewData["Message"] = "Welcome to ASP.NET MVC";
   return View(); // notice the absence of a view model
}

Aby uzyskać dostęp do tego w widoku Index.cshtml , możesz po prostu uzyskać dostęp do słownika ViewData za pomocą klucza użytego w metodzie akcji.

<h2>@ViewData["Message"]</h2>

ViewBag jest dynamicznym odpowiednikiem nietypowego słownika ViewData. Wykorzystuje dynamic typ C # do syntezy cukru.

Składnia do ustawiania niektórych danych na ViewBag to

ViewBag.Key = Value;

Więc jeśli chcemy przekazać ciąg komunikatu w naszym poprzednim przykładzie za pomocą ViewBag, to będzie

public ActionResult Index()
{
   ViewBag.Message = "Welcome to ASP.NET MVC";
   return View(); // not the absence of a view model
}

i w widoku indeksu

<h2>@ViewBag.Message</h2>

Dane nie są udostępniane między ViewBag a ViewData. ViewData wymaga rzutowania typu w celu uzyskania danych ze złożonych typów danych i sprawdzania wartości zerowych, aby uniknąć błędów, gdy View Bag nie wymaga rzutowania.

TempData może być używana, gdy chcesz utrwalić dane między tylko jednym żądaniem HTTP a następnym żądaniem HTTP. Żywotność danych przechowywanych w TempDataDictionary kończy się po drugim żądaniu. TempData jest więc przydatna w scenariuszach, w których podążasz za wzorcem 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
}

Kiedy zwrócimy return RedirectToAction("SomeActionMethod") , serwer wyśle odpowiedź 302 do klienta (przeglądarki) z wartością nagłówka lokalizacji ustawioną na adres URL na „SomeActionMethod”, a przeglądarka prześle całkowicie nowe żądanie. ViewBag / ViewData nie będzie w takim przypadku działać w celu udostępniania niektórych danych między tymi 2 połączeniami. W takich scenariuszach musisz używać TempData.

Cykl życia TempData

Dane zapisane w TempData są przechowywane w sesji i zostaną automatycznie usunięte na końcu pierwszego żądania, w którym dane są dostępne. Jeśli nigdy nie będzie czytany, będzie przechowywany do czasu, aż zostanie przeczytany lub upłynie limit czasu sesji.

Typowe użycie wygląda następująco: każda linia jest wywoływana z innego żądania:

//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

To zachowanie może być dodatkowo kontrolowane za pomocą metod Peek and Keep .

  • Dzięki Peek możesz odzyskać dane przechowywane w TempData bez oznaczania ich do usunięcia, więc dane będą nadal dostępne na przyszłe żądanie

    //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"];
    
  • Za pomocą Keep możesz określić, że klucz, który został oznaczony do usunięcia, powinien zostać zachowany. W takim przypadku pobieranie danych i zapisywanie ich przed usunięciem wymaga 2 wywołań metod:

    //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"];
    

Mając to na uwadze, używaj Peek gdy zawsze chcesz zachować wartość dla kolejnego żądania, i używaj Keep gdy zachowywanie wartości zależy od dodatkowej logiki.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow