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

Je révisais un projet et j'ai vu une Session[""] dans une méthode de controller et TempData[""] dans une autre. Est-il une différence entre les 4 ou est-il juste de 4 façons différentes de faire la même chose.

36
demandé sur MrM 2012-10-01 20:06:03

3 réponses

  • ViewData/ViewBag - valable uniquement pour la durée de la demande actuelle.

    vous le définissez dans une action de controller et l'utilisez dans la vue, puis il disparaît.

    La différence est que le premier est un dictionnaire alors que le second est juste un dynamic enrouler autour de ce dictionnaire.

    les deux pointent vers les mêmes données cependant.

    ViewBag a été introduit en ASP.NET MVC 3.

Exemple:

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

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

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

Même avec ViewBag mais il est dynamique:

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

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

<div>@ViewBag.foo</div>

donc comme vous pouvez le voir ViewData / ViewBag sont juste une alternative pour passer des informations à une vue à partir d'une action de contrôleur par rapport à la manière classique et Recommandée qui utilise une vue modèle:

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

puis:

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

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

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

comme vous pouvez le voir en utilisant les modèles de vue fournissent une approche fortement typée en passant des informations à une vue à partir d'une action de controller.

  • TempData - il permet de conserver l'information pendant la durée d'une seule demande subséquente. Vous stockez quelque chose dans TempData et vous redirigez. Dans l'action du contrôleur cible à laquelle vous avez redirigé vous pouvez récupérer la valeur qui a été 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 stockée dans TempData une fois que vous lisez. Sous les couvertures ASP.NET MVC maintient l'information dans le Session.

  • Session - mêmes que TempData sauf qu'il n'expire jamais, il sera valable pour toutes les demandes, pas un seul rediriger.
71
répondu Darin Dimitrov 2016-08-09 14:01:18

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

ViewData

ViewData est implémenté en utilisant ViewDataDictionary classe qui a stocké dans CurrentRequestContext. Ainsi, le cycle de vie de ViewData prendra fin lorsque la requête courante prendra fin.

ViewBag est aussi comme ViewData, et la seule différence est qu'il permet un partage dynamique les données en utilisant des objets dynamics.

TempData est une instance de très courte durée, et vous ne devez l'utiliser que pendant le et ultérieure demande seulement.Ce sera pratique si vous voulez utiliser des Redirections (RedirectToAction, RedirectToRoute, Redirect) dans ASP.net MVC et passer quelques données parmi les redirections. TempData stocke les données en Session mais framework dispose les données lorsque les requêtes actuelles et ultérieures prennent fin.

Session est une donnée de longue durée(n'expire jamais) qui appartient à la session de l'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 );
}
4
répondu marvelTracker 2016-01-16 11:40:41

ViewData:

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

ViewBag:

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

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

  • la durée de validité de ses valeurs dans la requête courante.
  • Dans la redirection entre les pages, sa valeur sera nulle.
  • pour des raisons de sécurité avant l'utilisation, vérifiez null.
  • le moulage n'est pas nécessaire, donc c'est plus rapide que ViewData.

TempData:

  • Un type spécial de dictionnaire dérivé de TempDataDictionary.
  • il a courte durée de vie, et utilisé pour envoyer des informations entre les pages (Redirect).
  • Après avoir rendu View complètement, sa valeur sera null.
  • pour des raisons de sécurité avant l'utilisation, vérifiez 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 les valeurs null; à Moins que, après un certain temps (session expire).
  • pour des raisons de sécurité avant utilisation, vérifiez si null.
  • le moulage doit être fait pour l'opération.

explication de l'article la différence entre ViewData, ViewBag et TempData. J'espère que vous pouvez vous référer à cet article pour votre besoin.

4
répondu Elnaz 2016-11-21 06:46:15