asp.net-mvc
ViewData, ViewBag, TempData
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
ViewData [klucz] = wartość;
ViewBag.Key = wartość;
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.