Jaki jest odpowiedni czas dla ViewData, ViewBag, Session, TempData
Edytowałem projekt i zobaczyłem sesję [""] w jednej metodzie kontrolera i TempData [ "" ] w innej. Czy jest różnica między 4 lub jest to po prostu 4 sposoby, aby zrobić to samo.
3 answers
-
ViewData / ViewBag - Ważne tylko przez czas trwania bieżącego żądania.
ustawiasz go w akcji kontrolera i używasz go w widoku, a następnie znika.
różnica polega na tym, że pierwszy jest słownikiem, podczas gdy drugi jest tylkodynamic
owijką wokół tego słownika.
oba wskazują na te same dane.
ViewBag został wprowadzony w ASP.NET MVC 3.
Przykład:
public ActionResult Index()
{
ViewData["foo"] = "bar";
return View();
}
I wewnątrz widoku możesz użyć tego wartość:
<div>@ViewData["foo"]</div>
To samo z ViewBag ale jest dynamiczne:
public ActionResult Index()
{
ViewBag.foo = "bar";
return View();
}
I wewnątrz widoku można użyć tej wartości:
<div>@ViewBag.foo</div>
Więc jak widać ViewData/ViewBag są tylko alternatywnym sposobem przekazywania informacji do widoku z akcji kontrolera w porównaniu do klasycznego i zalecanego sposobu, który używa modelu widoku:
public class MyViewModel
{
public string Foo { get; set; }
}
A potem:
public ActionResult Index()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
I wewnątrz twojego silnie wpisanego widoku:
@model MyViewModel
<div>@Html.DisplayFor(x => x.Foo)</div>
Jak widać za pomocą modeli widoku silnie wpisane podejście w przekazywaniu informacji do widoku z akcji kontrolera.
- TempData - pozwala na utrzymywanie informacji przez czas trwania pojedynczego kolejnego żądania. Przechowujesz coś wewnątrz TempData, a następnie przekierowujesz. W akcji kontrolera docelowego, do którego Przekierowano, można było pobrać wartość zapisaną w programie TempData.
Przykład:
public ActionResult Foo()
{
TempData["foo"] = "bar";
return RedirectToAction("bar");
}
public ActionResult Bar()
{
var value = TempData["foo"] as string;
// use the value here. If you need to pass it to the view you could
// use ViewData/ViewBag (I can't believe I said that but I will leave it for the moment)
return View();
}
ASP.NET MVC automatycznie wygaśnie wartość, która została zapisana w {[9] } po przeczytaniu. Pod kołdrą ASP.NET MVC utrzymuje informacje w Session
.
- Session - to samo co TempData z tą różnicą, że nigdy nie wygasa - będzie ważne dla wszystkich żądań, a nie dla pojedynczego przekierowania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-09 14:01:18
ASP.net MVC wprowadził ViewData, ViewBag, TempData, Session do przekazywania danych między kontrolerem do view.
ViewData
ViewData jest zaimplementowana przy użyciu klasy viewdatadictionary przechowywanej w CurrentRequestContext. Tak więc cykl życia ViewData zakończy się po zakończeniu bieżącego żądania.
ViewBag jest również podobny do ViewData, a jedyną różnicą jest to, że umożliwia dynamiczne udostępnianie danych za pomocą dynamics obiektów.
TempData jest bardzo krótkotrwałą instancją i należy jej używać tylko podczas bieżącegoi kolejnych żądań.Będzie to przydatne, jeśli chcesz użyć przekierowań (RedirectToAction, RedirectToRoute, Redirect) w ASP.net MVC i przekazać niektóre dane między przekierowaniami. TempData przechowuje dane w sesji, ale framework usuwa dane po zakończeniu bieżących i kolejnych żądań.
Sesja to dane długowieczne (nigdy nie wygasa), które należy do sesji użytkownika.Musisz być ostrożny, gdy używasz zmiennych sesji, które mogą łatwo powodować problemy.
protected void Session_Start(Object sender, EventArgs e)
{
int userType = 1;
HttpContext.Current.Session.Add("_SessionUserType",userType );
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-16 11:40:41
ViewData:
- jest specjalnym słownikiem odziedziczonym po
ViewDataDictionary
. - służy do wysyłania danych z kontrolera do wyświetlenia. / Align = "left" /
- zostanie zniszczony, jeśli masz
Redirect
. - ze względów bezpieczeństwa, lepiej sprawdzić go pod kątem
null
przed użyciem. - odlewanie powinno być wykonane do operacji.
ViewBag:
Jest typem dynamicznym (ten typ prezentowany jest w c # 4).
Like
ViewData
jest używany do wysyłania danych z kontrolera do widoku.- czas ważności jego wartości w bieżącym żądaniu.
- w przekierowaniu między stronami, jego wartość będzie null.
- ze względów bezpieczeństwa przed użyciem należy sprawdzić, czy nie ma
null
. -
odlewanie nie jest konieczne , więc jest szybsze niż
ViewData
.
TempData:
- specjalny rodzaj słownika wywodzący się z
TempDataDictionary
. - ma krótki czas życia i służy do przesyłania informacji między stronami (
Redirect
). - po całkowitym renderowaniu
View
jego wartością będzienull
. - ze względów bezpieczeństwa przed użyciem należy sprawdzić, czy nie ma
null
. - odlewanie powinno być wykonane do operacji.
Sesja:
- używany do wysyłania informacji między różnymi żądaniami.
- jego wartość nie jest
null
nie jest wartością null; chyba że po pewnym czasie (session expire
). - ze względów bezpieczeństwa przed użyciem należy sprawdzić, czy nie ma
null
. - odlewanie powinno być wykonane do operacji.
Ten artykuł wyjaśnia różnicę między ViewData, ViewBag i TempData. Mam nadzieję, że możesz odnieść się do tego artykułu do swoich potrzeb.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-21 06:46:15