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.

Author: MrM, 2012-10-01

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 tylko dynamic 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.
 71
Author: Darin Dimitrov,
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 );
}
 4
Author: marvelTracker,
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ędzie null.
  • 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.

 4
Author: Elnaz,
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