Quelle est la différence entre ViewData et ViewBag?

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.
  • L’utilisation de 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.

entrer la description de l'image ici

Afficher les données

  1. ViewData est utilisé pour transmettre des données du contrôleur à afficher
  2. ViewData est dérivé de la classe ViewDataDictionary et est fondamentalement un object Dictionary ieKeys et Values ​​où Keys est Ssortingng tandis que les valeurs seront des objects.
  3. La typographie des données est requirejse lors de la récupération des données à partir de ViewData en raison de son type de données Object et également de la vérification vvalue null pour une transtypage, faute de quoi l’application sera interrompue. Si la redirection se produit, sa valeur devient nulle. Lire la différence complète entre TempData ViewData et View Bag

http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html

ViewData

  1. ViewData est utilisé pour transmettre des données du contrôleur à afficher
  2. Il est dérivé de la classe ViewDataDictionary
  3. Il est disponible uniquement pour la demande en cours
  4. Nécessite le transtypage pour un type de données complexe et vérifie les valeurs nulles pour éviter les erreurs
  5. Si la redirection se produit, sa valeur devient nulle

ViewBag

  1. ViewBag est également utilisé pour transmettre des données du contrôleur à la vue correspondante
  2. ViewBag est une propriété dynamic qui tire parti des nouvelles fonctionnalités dynamics de C # 4.0
  3. Il est également disponible uniquement pour la demande en cours
  4. Si la redirection se produit, sa valeur devient nulle
  5. Ne nécessite pas de conversion pour un type de données complexe

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: