Recherche…


Introduction

ViewData et ViewBag sont utilisés pour transférer des données du contrôleur à la vue.

ViewData n'est rien d'autre qu'un dictionnaire d'objets et il est accessible par chaîne en tant que clé.

ViewBag est très similaire à ViewData. ViewBag est une propriété dynamique. ViewBag est juste un wrapper autour de ViewData.

TempData conserve les données pour le temps de la requête HTTP, ce qui signifie qu'il contient des données entre deux requêtes consécutives. TempData nous aide à transférer des données entre des contrôleurs ou entre des actions. Utilise la session en interne.

Syntaxe

  1. ViewData [clé] = valeur;

  2. ViewBag.Key = valeur;

  3. TempData [clé] = valeur;

Que sont ViewData, ViewBag et TempData?

ViewData est le mécanisme permettant à un contrôleur de fournir des données à la vue qu'il présente, sans utiliser ViewModel. Plus précisément, ViewData est un dictionnaire disponible à la fois dans les méthodes d'action et les vues MVC. Vous pouvez utiliser ViewData pour transférer certaines données de votre méthode d'action vers la vue renvoyée par la méthode d'action.

Comme il s'agit d'un dictionnaire, vous pouvez utiliser la syntaxe du dictionnaire pour définir et obtenir des données.

ViewData[key] = value; // In the action method in the controller

Par exemple, si vous souhaitez transmettre un message de chaîne de votre méthode d'action Index à votre vue Index Index.cshtml , vous pouvez le faire.

public ActionResult Index()
{
   ViewData["Message"] = "Welcome to ASP.NET MVC";
   return View(); // notice the absence of a view model
}

Pour y accéder dans votre vue Index.cshtml , vous pouvez simplement accéder au dictionnaire ViewData avec la clé utilisée dans la méthode d'action.

<h2>@ViewData["Message"]</h2>

ViewBag est l'équivalent dynamique du dictionnaire ViewData non typé. Il tire parti du type dynamic C # pour l'expérience du sucre syntaxique.

La syntaxe pour définir certaines données sur ViewBag est

ViewBag.Key = Value;

Donc, si nous voulons passer la chaîne de message dans notre exemple précédent en utilisant ViewBag, ce sera

public ActionResult Index()
{
   ViewBag.Message = "Welcome to ASP.NET MVC";
   return View(); // not the absence of a view model
}

et dans votre vue d'index,

<h2>@ViewBag.Message</h2>

Les données ne sont pas partagées entre ViewBag et ViewData. ViewData nécessite une conversion de type typé pour obtenir des données à partir de types de données complexes et vérifier les valeurs NULL pour éviter les erreurs lorsque View Bag ne nécessite pas de transtypage.

TempData peut être utilisé lorsque vous souhaitez conserver les données entre une requête HTTP et la requête HTTP suivante uniquement. La durée de vie des données stockées dans TempDataDictionary se termine après la deuxième requête. Ainsi, TempData est utile dans les scénarios où vous suivez le modèle 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
}

Lorsque nous return RedirectToAction("SomeActionMethod") , le serveur enverra une réponse 302 au client (navigateur) avec la valeur d'en-tête d'emplacement définie sur l'URL "SomeActionMethod" et le navigateur effectuera une requête totalement nouvelle. ViewBag / ViewData ne fonctionnera pas dans ce cas pour partager certaines données entre ces 2 appels. Vous devez utiliser TempData dans de tels scénarios.

Cycle de vie TempData

Les données enregistrées dans TempData sont stockées dans la session et seront automatiquement supprimées à la fin de la première requête à laquelle les données sont accédées. S'il n'est jamais lu, il sera conservé jusqu'à ce que la lecture soit terminée ou que la session expire.

L'utilisation typique ressemble à la séquence suivante (où chaque ligne est appelée à partir d'une autre requête):

//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

Ce comportement peut être un autre contrôleur avec les méthodes Peek et Keep .

  • Avec Peek vous pouvez récupérer les données stockées dans TempData sans les marquer pour suppression, afin que les données soient toujours disponibles lors d'une prochaine demande.

    //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"];
    
  • Avec Keep vous pouvez spécifier qu'une clé marquée pour suppression doit être conservée. Dans ce cas, la récupération des données et leur enregistrement depuis la suppression nécessite 2 appels de méthode:

    //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"];
    

Dans cet esprit, utilisez Peek lorsque vous souhaitez toujours conserver la valeur pour une autre demande et utilisez l' Keep lorsque la conservation de la valeur dépend d'une logique supplémentaire.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow