J’ai vu le ViewBag
dans MVC 3. Quelle est la différence avec ViewData
dans MVC 2?
Il utilise la fonctionnalité dynamic C # 4.0. Il atteint le même objective que viewdata et devrait être évité en faveur de l’utilisation de modèles de vue fortement typés (de la même manière que viewdata devrait être évité).
Donc, fondamentalement, il remplace les chaînes magiques :
ViewData["Foo"]
avec des propriétés magiques :
ViewBag.Foo
pour lequel vous n’avez pas de temps de compilation.
Je continue de reprocher à Microsoft d’introduire ce concept dans MVC.
Le nom des propriétés est sensible à la casse.
En interne, les propriétés ViewBag sont stockées sous forme de paires nom / valeur dans le dictionnaire ViewData .
Remarque: dans la plupart des versions préliminaires de MVC 3, la propriété ViewBag a été nommée ViewModel, comme indiqué dans cet extrait de notes de version de MVC 3:
(édité 10-8-12) Il a été suggéré que je poste la source de cette information que j’ai posté, voici la source: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4
Les contrôleurs MVC 2 prennent en charge une propriété ViewData qui vous permet de transmettre des données à un modèle de vue à l’aide d’une API de dictionnaire liée tardivement. Dans MVC 3, vous pouvez également utiliser une syntaxe un peu plus simple avec la propriété ViewBag pour atteindre le même objective. Par exemple, au lieu d’écrire ViewData [“Message”] = “text”, vous pouvez écrire ViewBag.Message = “text”. Vous n’avez pas besoin de définir de classes fortement typées pour utiliser la propriété ViewBag. Comme il s’agit d’une propriété dynamic, vous pouvez simplement obtenir ou définir des propriétés et les résoudre dynamicment au moment de l’exécution. En interne, les propriétés ViewBag sont stockées sous forme de paires nom / valeur dans le dictionnaire ViewData. (Remarque: dans la plupart des versions préliminaires de MVC 3, la propriété ViewBag était nommée propriété ViewModel.)
ViewBag vs ViewData dans MVC
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
Similitudes entre ViewBag et ViewData:
Permet de conserver les données lorsque vous passez d’un contrôleur à un autre. Utilisé pour transmettre des données du contrôleur à la vue correspondante. La durée de vie courte signifie que la valeur devient nulle lorsque la redirection se produit. C’est parce que leur objective 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’objects dérivé de la classe ViewDataDictionary et accessible à l’aide de chaînes en tant que clés. ViewBag est une propriété dynamic qui tire parti des nouvelles fonctionnalités dynamics de C # 4.0. ViewData nécessite une conversion de type pour les types de données complexes et vérifie les valeurs NULL pour éviter les erreurs. ViewBag ne nécessite pas de transtypage pour un 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(); }
Appeler en vue
@ViewBag.Name @ViewData["Name"]
ViewData
: il est nécessaire de transtyper les types de données complexes et de vérifier les valeurs NULL pour éviter les erreurs.
ViewBag
: il ne nécessite pas de ViewBag
de type pour les types de données complexes.
Prenons l’exemple suivant:
public class HomeController : Controller { public ActionResult Index() { var emp = new Employee { EmpID=101, Name = "Deepak", Salary = 35000, Address = "Delhi" }; ViewData["emp"] = emp; ViewBag.Employee = emp; return View(); } }
Et le code pour View
est le suivant:
@model MyProject.Models.EmpModel; @{ Layout = "~/Views/Shared/_Layout.cshtml"; ViewBag.Title = "Welcome to Home Page"; var viewDataEmployee = ViewData["emp"] as Employee; //need type casting } Welcome to Home Page
This Year Best Employee is! @ViewBag.Employee.Name
@viewDataEmployee.Name
Toutes les réponses suggèrent que ViewBag
et / ou ViewData
transmettent des données de Controller
à Views
ce qui constitue une information erronée. Les deux sont très utiles pour transmettre des données de Views à Layout ou Partial to Views (ou ViewComponents, etc.). Ce n’est pas exclusif du contrôleur.
comme l’exemple par défaut asp.net avoir cela dans la page de mise en page:
@ViewData["Title"] - MyApp
et dans n’importe quel sharepoint vue
ViewData["Title"] = "Details";
Alors, pour poser la question: “Quelle est la différence entre ViewBag
et ViewData
?”
La différence la plus notable est que ViewData
est un dictionnaire ViewBag
alors que ViewBag
est un type dynamic.
Notez que les données à l’intérieur est le même
ViewData["Title"] = "MyTitle"; ViewBag.Title; // returns "MyTitle";
Quand utiliser l’un ou l’autre?
ViewBag
ne prend pas en charge les noms C # non valides. vous ne pouvez pas accéder à ViewData["Key With Space"]
avec ViewBag
ViewBag.Something
est dynamic et vous pouvez avoir des problèmes lors de l’appel de méthodes (comme les méthodes d’extension) qui doivent connaître le paramètre exact au moment de la compilation. ViewBag
peut vérifier le nettoyeur syntaxique ViewBag.Person?.Name
: ViewBag.Person?.Name
ViewData
possède toutes les propriétés d’un dictionnaire comme ContainsKey
, Add
, etc., vous pouvez donc utiliser ViewData.Add("somekey", "somevalue")
gardez à l’esprit que cela peut ViewData.Add("somekey", "somevalue")
exceptions. ViewData
sur les vues nécessite TypeCasting, contrairement à ViewBag
. Connaître les différences subtiles, utiliser l’une ou l’autre est beaucoup plus une préférence gustative.
Normalement, vous pouvez penser à ViewBag.AnyKey
à un alias de ViewData["AnyKey"]
Puis-je vous recommander de ne pas utiliser non plus?
Si vous souhaitez “envoyer” des données à votre écran, envoyez un object fortement typé (AKA ViewModel) car il est plus facile à tester.
Si vous vous liez à une sorte de “modèle” et que vous avez des éléments aléatoires “viewbag” ou “viewdata”, cela rend les tests automatisés très difficiles.
Si vous les utilisez, réfléchissez à la manière dont vous pourriez restructurer et utilisez simplement ViewModels.
Certaines différences subtiles signifient que vous pouvez utiliser ViewData et ViewBag de manière légèrement différente de la vue. Un avantage est décrit dans cet article http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx et montre que le casting peut être évité dans l’exemple en utilisant ViewBag au lieu de ViewData.
viewdata: est un dictionnaire utilisé pour stocker des données entre View et controller, vous devez convertir l’ object de données de vue dans son modèle correspondant dans la vue pour pouvoir en extraire des données …
ViewBag: est une propriété dynamic similaire dans son fonctionnement aux données de vue. Cependant, il vaut mieux ne pas avoir besoin de la convertir en modèle correcteur avant de l’utiliser dans la vue …
public ActionResult Index() { ViewBag.Name = "Monjurul Habib"; return View(); } public ActionResult Index() { ViewData["Name"] = "Monjurul Habib"; return View(); } In View: @ViewBag.Name @ViewData["Name"]
De cette façon, nous pouvons le faire utiliser les valeurs pour transmettre les informations entre le contrôleur à une autre page avec TEMP DATA
Bien que vous ne disposiez d’aucun avantage technique pour choisir un format par rapport à un autre, vous devez connaître certaines différences importantes entre les deux syntaxes. Une différence évidente est que ViewBag ne fonctionne que lorsque la clé à laquelle vous accédez est un identifiant C # valide. Par exemple, si vous placez une valeur dans ViewData [“Key With Spaces”], vous ne pouvez pas accéder à cette valeur à l’aide de ViewBag car le code ne sera pas compilé. Un autre problème clé à prendre en compte est que vous ne pouvez pas transmettre les valeurs dynamics en tant que parameters aux méthodes d’extension. Le compilateur C # doit connaître le type réel de chaque paramètre au moment de la compilation afin de choisir la méthode d’extension correcte. Si un paramètre est dynamic, la compilation échouera. Par exemple, ce code échouera toujours: @ Html.TextBox (“name”, ViewBag.Name). Pour contourner ce problème, utilisez ViewData [“Name”] ou lancez le va
L’une des principales différences entre ViewData et ViewBag est la suivante:
ViewData: cela retournera l’object, peu importe ce que vous avez assigné à cela et vous devrez le convertir à nouveau au type d’origine.
ViewBag: il est assez intelligent de renvoyer le type exact que vous lui avez atsortingbué, peu importe que vous ayez assigné un type simple (par exemple, int, ssortingng, etc.) ou un type complexe.
Ex: Code du contrôleur.
namespace WebApplication1.Controllers { public class HomeController : Controller { public ActionResult Index() { Products p1 = new Products(); p1.productId = 101; p1.productName = "Phone"; Products p2 = new Products(); p2.productId = 102; p2.productName = "laptop"; List products = new List (); products.Add(p1); products.Add(p2); ViewBag.Counsortinges = products; return View(); } } public class Products { public int productId { get; set; } public ssortingng productName { get; set; } } }
Voir le code.
@foreach (WebApplication1.Controllers.Products item in ViewBag.Counsortinges) { - @item.productId @item.productName
}
Écran OutPut.
Afficher les données
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
ViewData
ViewBag
ViewBag et ViewData sont deux moyens utilisés pour transmettre des informations du contrôleur à afficher dans ASP.Net MVC. Le but de l’utilisation des deux mécanismes est de fournir la communication entre le contrôleur et View. Les deux ont une durée de vie courte, c’est-à-dire que la valeur des deux devient nulle une fois que la redirection a eu lieu, une fois que la page a été redirigée de la page source (ViewBag ou ViewData) vers la page cible. devient nul.
En dépit de ces similitudes, les deux (ViewBag et ViewData) sont deux choses différentes si nous parlons de la mise en œuvre des deux. Les différences sont les suivantes:
1.) Si nous analysons les deux méthodes d’implémentation, nous constaterons que ViewData est une structure de données de dictionnaire – Dictionnaire d’objects dérivé de ViewDataDictionary et accessible à l’aide de chaînes comme clés de ces valeurs alors que ViewBag utilise les fonctionnalités dynamics introduites dans C # 4.0 et est une propriété dynamic.
2.) En accédant aux valeurs de la forme ViewData, nous devons transtyper les valeurs (types de données) telles qu’elles sont stockées en tant qu’objects dans le dictionnaire ViewData, mais cela n’est pas nécessaire si nous accédons à la valeur avec ViewBag.
3.) Dans ViewBag, nous pouvons définir la valeur comme ceci:
ViewBag.Name = "Value";
et peut accéder comme suit:
@ViewBag.Name
Dans le cas de ViewData, les valeurs peuvent être définies et accessibles comme suit: Définition de ViewData comme suit:
ViewData["Name"] = "Value";
et accéder à une telle valeur
@ViewData["Name"]
Pour plus de détails cliquez ici: