ViewBag, ViewData et TempData
N'importe quel corps pourrait-il expliquer, quand utiliser
- TempData
- ViewBag
- ViewData
J'ai une exigence, où je dois définir une valeur dans un contrôleur un, ce contrôleur redirigera vers le contrôleur deux et le contrôleur deux rendra la vue.
J'ai essayé d'utiliser ViewBag, la valeur est perdue au moment où j'atteint le contrôleur deux.
Puis-je savoir quand utiliser et avantages ou inconvénients?
Merci
8 réponses
1) TempData
Vous permet de stocker des données qui survivront pour une redirection. En interne, il utilise la Session comme magasin de cuisson, c'est juste qu'après la redirection, les données sont automatiquement expulsées. Le motif est le suivant:
public ActionResult Foo()
{
// store something into the tempdata that will be available during a single redirect
TempData["foo"] = "bar";
// you should always redirect if you store something into TempData to
// a controller action that will consume this data
return RedirectToAction("bar");
}
public ActionResult Bar()
{
var foo = TempData["foo"];
...
}
2) ViewBag, ViewData
Permet de stocker des données dans un contrôleur qui sera utilisé dans la vue correspondante. Cela suppose que l'action renvoie une vue et ne redirige pas. Vit uniquement pendant la demande en cours.
Le modèle est le suivant:
public ActionResult Foo()
{
ViewBag.Foo = "bar";
return View();
}
Et dans la vue:
@ViewBag.Foo
Ou avec ViewData:
public ActionResult Foo()
{
ViewData["Foo"] = "bar";
return View();
}
Et dans la vue:
@ViewData["Foo"]
ViewBag
est juste un wrapper dynamique autour de ViewData
et n'existe que dans ASP.NET MVC 3.
Ceci étant dit, aucune de ces deux constructions ne devrait jamais être utilisée. Vous devez utiliser des modèles de vue et des vues fortement typées. Donc, le motif correct est le suivant:
Vue modèle:
public class MyViewModel
{
public string Foo { get; set; }
}
Action:
public Action Foo()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
Vue fortement typée:
@model MyViewModel
@Model.Foo
Après cette brève introduction, répondons à votre question:
Mon exigence est que je veux définir une valeur dans un contrôleur, qui controller redirigera vers ControllerTwo et Controller2 rendra vue.
public class OneController: Controller
{
public ActionResult Index()
{
TempData["foo"] = "bar";
return RedirectToAction("index", "two");
}
}
public class TwoController: Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
Foo = TempData["foo"] as string
};
return View(model);
}
}
Et la vue correspondante (~/Views/Two/Index.cshtml
):
@model MyViewModel
@Html.DisplayFor(x => x.Foo)
Il y a aussi des inconvénients à utiliser TempData: si l'utilisateur frappe F5 sur le page cible, les données seront perdues.
Personnellement, je n'utilise pas non plus TempData. C'est parce qu'en interne, il utilise Session et je désactive session dans Mes applications. Je préfère un moyen plus reposant d'y parvenir. Qui est: dans la première action du contrôleur qui effectue la redirection stocker l'objet dans votre magasin de données et l'utilisateur unique généré id lors de la redirection. Ensuite, sur l'action cible, utilisez cet id pour récupérer l'objet initialement stocké:
public class OneController: Controller
{
public ActionResult Index()
{
var id = Repository.SaveData("foo");
return RedirectToAction("index", "two", new { id = id });
}
}
public class TwoController: Controller
{
public ActionResult Index(string id)
{
var model = new MyViewModel
{
Foo = Repository.GetData(id)
};
return View(model);
}
}
La vue reste la de même.
ASP.NET MVC nous offre trois options ViewData, ViewBag et TempData pour transmettre des données du contrôleur à la vue et à la demande suivante. ViewData et ViewBag sont presque similaires et TempData assume une responsabilité supplémentaire. Permet de discuter ou d'obtenir des points clés sur ces trois objets:
Similarités entre ViewBag et ViewData:
- Aide à maintenir les données lorsque vous passez du contrôleur à la vue.
- permet de transmettre des données du contrôleur à vue.
- la durée de vie courte signifie que la valeur devient nulle lorsque la redirection se produit. C'est parce que leur but est de fournir un moyen de communiquer entre les contrôleurs et les vues. C'est un mécanisme de communication au sein du d'appel de serveur.
Différence entre ViewBag et ViewData:
- ViewData est un dictionnaire d'objets qui est dérivé de ViewDataDictionary classe et accessible en utilisant des chaînes comme clés.
- ViewBag est une propriété dynamique qui tire parti de la nouvelle dynamique caractéristiques en C # 4.0.
- ViewData nécessite la typecasting pour les types de données complexes et la valeurs null pour éviter les erreurs.
- ViewBag ne nécessite pas de typecasting pour les types de données complexes.
Exemple ViewBag & ViewData:
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
En Vue:
@ViewBag.Name
@ViewData["Name"]
TempData:
TempData est également un dictionnaire dérivé de la classe TempDataDictionary et stocké dans la session short lives et c'est une clé de chaîne et une valeur d'objet. Le la différence est que le cycle de vie de l'objet. TempData conserve les informations pendant le temps D'une requête HTTP. Cela signifie seulement d'une page à l'autre. Cela fonctionne également avec une redirection 302/303 car elle est dans la même requête HTTP. Aide à conserver les données lorsque vous vous déplacez d'un contrôleur à l'autre contrôleur ou d'une action à une autre action. En d'autres termes, lorsque vous redirigez, "TempData" aide à maintenir les données entre ces redirections. Il utilise en interne des variables de session. Utilisation des données temporaires pendant la requête actuelle et suivante signifie uniquement qu'elle est utilisée lorsque vous êtes sûr que la requête suivante redirigera vers la vue suivante. Il nécessite la typecasting pour le type de données complexe et vérifier les valeurs null pour éviter les erreurs. Généralement utilisé pour stocker des messages uniques comme les messages d'erreur, les messages de validation.
public ActionResult Index()
{
var model = new Review()
{
Body = "Start",
Rating=5
};
TempData["ModelName"] = model;
return RedirectToAction("About");
}
public ActionResult About()
{
var model= TempData["ModelName"];
return View(model);
}
Le Dernier mécanisme est la Session qui fonctionne comme ViewData, comme un dictionnaire qui prend une chaîne pour la clé et un objet pour la valeur. Celui-ci est stocké dans le Cookie client et peut être utilisé pour un temps beaucoup plus long. Il a également besoin de plus de vérification pour ne jamais avoir d'informations confidentielles. En ce qui concerne ViewData ou ViewBag, vous devez l'utiliser intelligemment pour les performances de l'application. Parce que chaque action passe par tout le cycle de vie de régulier asp.net demande mvc. Vous pouvez utiliser ViewData / ViewBag dans votre action enfant, mais veillez à ne pas l'utiliser pour remplir les données non liées qui peuvent polluer votre contrôleur.
TempData
Fondamentalement, c'est comme un DataReader, une fois lu, les données seront perdues.
Regardez cette Vidéo
Exemple
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
TempData["T"] = "T";
return RedirectToAction("About");
}
public ActionResult About()
{
return RedirectToAction("Test1");
}
public ActionResult Test1()
{
String str = TempData["T"]; //Output - T
return View();
}
}
Si vous faites attention au code ci-dessus, RedirectToAction n'a aucun impact sur TempData jusqu'à ce que TempData soit lu. Ainsi, une fois TempData lu, les valeurs seront perdues.
Comment puis-je garder le TempData après la lecture?
Vérifier la sortie en action Méthode Test 1 et Test 2
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
TempData["T"] = "T";
return RedirectToAction("About");
}
public ActionResult About()
{
return RedirectToAction("Test1");
}
public ActionResult Test1()
{
string Str = Convert.ToString(TempData["T"]);
TempData.Keep(); // Keep TempData
return RedirectToAction("Test2");
}
public ActionResult Test2()
{
string Str = Convert.ToString(TempData["T"]); //OutPut - T
return View();
}
}
Si vous faites attention au code ci-dessus, les données ne sont pas perdues après RedirectToAction ainsi qu'après avoir lu les données et la raison en est que nous utilisons TempData.Keep()
. c'est ça
De cette façon, vous pouvez le faire persister aussi longtemps que vous le souhaitez dans d'autres contrôleurs.
ViewBag/ViewData
Les données persisteront dans la vue correspondante
TempData dans Asp.Net MVC est l'une des fonctionnalités très utiles. Il est utilisé pour transmettre des données de la requête actuelle à la requête suivante. En d'autres termes, si nous voulons envoyer des données d'une page à une autre page pendant la redirection, nous pouvons utiliser TempData, mais nous devons prendre en compte le code pour réaliser cette fonctionnalité dans MVC. Parce que la durée de vie de TempData est très courte et ne se trouve que jusqu'à ce que la vue cible soit complètement chargée. Mais, nous pouvons utiliser la méthode Keep() pour persister les données dans TempData.
ViewBag, ViewData, TempData et état de vue dans MVC
Http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
ASP.NET MVC nous offre trois options ViewData, VieBag et TempData pour transmettre des données du contrôleur à la vue et à la prochaine demande. ViewData et ViewBag sont presque similaires et TempData assume une responsabilité supplémentaire.
Similarités entre ViewBag et ViewData:
Aide à maintenir données lorsque vous passez du contrôleur à la vue. Utilisé pour passez les données du contrôleur à la vue correspondante. La vie courte signifie la valeur devient nulle lorsque la redirection se produit. C'est parce que leur objectif est de fournir un moyen de communiquer entre les contrôleurs et les vues. C'est un mécanisme de communication dans l'appel du serveur.
Différence entre ViewBag et ViewData:
ViewData est un dictionnaire d'objets qui est dérivé de Classe ViewDataDictionary et accessible en utilisant des chaînes comme clés. ViewBag est une propriété dynamique qui tire parti des nouvelles fonctionnalités dynamiques en C # 4.0. ViewData nécessite la typecasting pour les types de données complexes et vérifiez les valeurs null pour éviter les erreurs. ViewBag ne nécessite pas typecasting pour le type de données complexe.
Exemple ViewBag & ViewData:
public ActionResult Index()
{
ViewBag.Name = "Arun Prakash";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Arun Prakash";
return View();
}
En vue, nous appelons comme ci-dessous:
@ViewBag.Name
@ViewData["Name"]
TempData:
Aide à maintenir les données lorsque vous vous déplacez d'un contrôleur à d'autres contrôleur ou d'une action à l'autre action. En d'autres termes lorsque vous redirect, "Tempdata" aide à maintenir les données entre ces redirections. Il utilise en interne des variables de session. TempData est censé être un très de courte durée, et vous ne devez l'utiliser que pendant le courant et les demandes suivantes seulement
Le seul scénario où L'utilisation de TempData fonctionnera de manière fiable est lorsque vous redirigez. C'est parce qu'une redirection tue la requête actuelle (et envoie le code d'état HTTP 302 objet déplacé vers le client), puis crée une nouvelle requête sur le serveur pour servir la vue redirigée.
Il nécessite la typecasting pour le type de données complexe et vérifier les valeurs null pour éviter les erreurs.
public ActionResult Index()
{
var model = new Review()
{
Body = "Start",
Rating=5
};
TempData["ModelName"] = model;
return RedirectToAction("About");
}
public ActionResult About()
{
var model= TempData["ModelName"];
return View(model);
}
void Keep()
Calling this method with in the current action ensures that all the items in TempData are not removed at the end of the current request.
@model MyProject.Models.EmpModel;
@{
Layout = "~/Views/Shared/_Layout.cshtml";
ViewBag.Title = "About";
var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
TempData.Keep(); // retains all strings values
}
void Keep(string key)
Calling this method with in the current action ensures that specific item in TempData is not removed at the end of the current request.
@model MyProject.Models.EmpModel;
@{
Layout = "~/Views/Shared/_Layout.cshtml";
ViewBag.Title = "About";
var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
TempData.Keep("emp"); // retains only "emp" string values
}
TempData sera toujours disponible jusqu'à la première lecture, une fois que vous l'avez lu, il n'est plus disponible peut être utile de passer un message rapide aussi pour voir qui disparaîtra après la première lecture. ViewBag C'est plus utile lors du passage rapide de données à la vue, normalement vous devriez passer toutes les données à la vue via le modèle, mais il y a des cas où vous modélisez directement à partir de la classe qui est mappée dans la base de données comme entity framework dans ce cas vous ne faites pas quoi changer votre modèle pour passer une nouvelle pièce de données, vous pouvez coller cela dans le viewbag ViewData est juste une version indexée de ViewBag et a été utilisé avant MVC3
La portée est également différente entre viewbag et temptdata. viewbag est basé sur first view (non partagé entre les méthodes d'action) mais temptdata peut être partagé entre une méthode d'action et juste une autre.