web-dev-qa-db-fra.com

Quel est le bon moment pour ViewData, ViewBag, Session, TempData

J'étais en train de modifier un projet et j'ai vu une session [""] dans une méthode de contrôleur et TempData [""] dans une autre. Y a-t-il une différence entre les 4 ou est-ce juste 4 façons de faire la même chose.

40
MrM
  • ViewData/ViewBag - valide uniquement pour la durée de la demande en cours.
    Vous le définissez dans une action de contrôleur et l'utilisez dans la vue, puis il disparaît.
    La différence est que le premier est un dictionnaire tandis que le second est juste un wrapper dynamic autour de ce dictionnaire.
    Les deux pointent cependant vers les mêmes données.
    ViewBag a été introduit dans ASP.NET MVC 3.

Exemple:

public ActionResult Index()
{
    ViewData["foo"] = "bar";
    return View();
}

et à l'intérieur de la vue, vous pouvez utiliser cette valeur:

<div>@ViewData["foo"]</div>

Pareil avec ViewBag mais c'est dynamique:

public ActionResult Index()
{
    ViewBag.foo = "bar";
    return View();
}

et à l'intérieur de la vue, vous pouvez utiliser cette valeur:

<div>@ViewBag.foo</div>

Donc, comme vous pouvez le voir, ViewData/ViewBag ne sont qu'un moyen alternatif de transmettre des informations à une vue à partir d'une action de contrôleur par rapport à la manière classique et recommandée qui utilise un modèle de vue:

public class MyViewModel
{
    public string Foo { get; set; }
}

et alors:

public ActionResult Index()
{
    var model = new MyViewModel { Foo = "bar" };
    return View(model);
}

et à l'intérieur de votre vue fortement typée:

@model MyViewModel
<div>@Html.DisplayFor(x => x.Foo)</div>

Comme vous pouvez le voir, l'utilisation de modèles de vue fournit une approche fortement typée pour transmettre des informations à une vue à partir d'une action de contrôleur.

  • TempData - il permet de conserver les informations pendant la durée d'une seule demande ultérieure. Vous stockez quelque chose dans TempData, puis redirigez. Dans l'action du contrôleur cible vers laquelle vous avez redirigé, vous pouvez récupérer la valeur stockée dans TempData.

Exemple:

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 expirera automatiquement la valeur qui a été stockée dans TempData une fois que vous l'avez lu. Sous les couvertures, ASP.NET MVC conserve les informations dans le Session.

  • Session - identique à TempData sauf qu'il n'expire jamais - il sera valide pour toutes les requêtes, pas une seule redirection.
76
Darin Dimitrov

ASP.net MVC introduit ViewData, ViewBag, TempData, Session pour passer les données entre les contrôleurs à afficher.

ViewData

ViewData est implémenté à l'aide de la classe ViewDataDictionary qui est stockée dans CurrentRequestContext. Ainsi, le cycle de vie de ViewData se terminera à la fin de la demande en cours.

ViewBag est également comme ViewData, et la seule différence est qu'il permet de partager dynamiquement les données en utilisant des objets dynamiques.

TempData est une instance à très courte durée de vie, et vous ne devez l'utiliser que pendant les requêtes current et suivantes uniquement. Cela sera pratique si vous souhaitez utiliser les redirections (RedirectToAction, RedirectToRoute, Redirect) dans ASP.net MVC et transmettre certaines données entre les redirections. TempData stocke les données dans Session mais le framework supprime les données à la fin des requêtes actuelles et suivantes.

Session est une donnée longue durée (N'expire jamais) qui appartient à la session utilisateur. Vous devez être attentif lorsque vous utilisez des variables de session qui peuvent facilement causer des problèmes.

protected void Session_Start(Object sender, EventArgs e) 
{
   int userType = 1;
   HttpContext.Current.Session.Add("_SessionUserType",userType );
}
6
marvelTracker

ViewData:

  • Est un dictionnaire spécial hérité de ViewDataDictionary.
  • Utilisé pour envoyer des données du contrôleur à afficher.
  • Sa durée de vie est la demande actuelle.
  • Il sera détruit si vous avez Redirect.
  • Pour des raisons de sécurité, il est préférable de le vérifier pour null avant utilisation.
  • Le moulage doit être fait pour l'opération.

ViewBag:

  • Est un type dynamique (ce type est présenté en c # 4).

  • Comme ViewData est utilisé pour envoyer des données du contrôleur à la vue.

  • La durée de validité de ses valeurs dans la requête en cours.
  • Dans la redirection entre les pages, sa valeur sera nulle.
  • Pour des raisons de sécurité avant utilisation, vérifiez-le pour null.
  • Le casting n'est pas nécessaire , il est donc plus rapide que ViewData.

TempData:

  • Un type spécial de dictionnaire dérivé de TempDataDictionary.
  • Il a Durée de vie courte , et utilisé pour envoyer des informations entre les pages (Redirect).
  • Après avoir rendu le View complètement, sa valeur sera null.
  • Pour des raisons de sécurité avant utilisation, vérifiez-le pour null.
  • Le moulage doit être fait pour l'opération.

Session:

  • utilisé Pour envoyer des informations entre différentes demandes.
  • Sa valeur n'est pas null pas des valeurs nulles; Sauf après un certain temps (session expire).
  • Pour des raisons de sécurité avant utilisation, vérifiez-le pour null.
  • Le moulage doit être fait pour l'opération.

This article explique la différence entre ViewData, ViewBag et TempData. J'espère que vous pourrez consulter cet article pour votre besoin.

4
Elnaz