asp.net-mvc
ViewData, ViewBag, TempData
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
ViewData [clé] = valeur;
ViewBag.Key = valeur;
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.