Quelle est la différence entre ViewData et ViewBag?

Réponses:

388

Il utilise la fonctionnalité dynamique C # 4.0. Il atteint le même objectif que les données de vue et doit être évité en faveur de l'utilisation de modèles de vue fortement typés (de la même manière que les données de vue doivent être évitées).

Donc, fondamentalement, il remplace les chaînes magiques :

ViewData["Foo"]

aux propriétés magiques :

ViewBag.Foo

pour lequel vous n'avez aucune sécurité de temps de compilation.

Je continue de blâmer Microsoft d'avoir introduit ce concept dans MVC.

Le nom des propriétés est sensible à la casse.

Darin Dimitrov
la source
11
Dans quel but blâmez-vous Microsoft? Si aucune vue n'est disponible, comment pourrions-nous lier la liste déroulante du modèle. (Je ne pense pas que l'utilisation de la liste de sélection à l'intérieur du modèle serait une bonne idée)
Subin Jacob
15
@SubinJacob Vous devriez vraiment poser une nouvelle question si vous voulez une réponse à cela. La création d'une liste de sélection est certainement la voie à suivre pour créer une liste déroulante.
MiniRagnarok
25
Je pense que c'est un peu subjectif. Les modèles fortement typés sont agréables et yada yada, mais pour les scénarios où vous obtenez rapidement une vue opérationnelle, ViewBag et similaire font le travail plus rapidement que Controller, View, Model, AutoMapper vers ViewModel, etc.
Craig Brett
11
@Darin, pourquoi "blâmez-vous" Microsoft d'avoir introduit cela? C'est juste un outil donné aux développeurs. Si vous savez ce que vous faites, vous pouvez en tirer le meilleur parti. Si vous ne l'aimez pas ou si vous vous sentez plus sujet aux erreurs, ne l'utilisez tout simplement pas. :)
Bilal Fazlani
5
Comment proposez-vous de passer des données entre les partiels et la mise en page? Les gens blâment quand ils ne voient pas l'image complète. J'imagine que vous avez des contrôleurs de base et des modèles de vue de base ou des objets statiques / singletons partout. Devinez quoi, apprenez mieux à utiliser les données de vue et blâmez-vous d'utiliser le mauvais outil pour le travail.
Bart Calixto
42

Les propriétés ViewBag sont stockées en interne 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é le 10-8-12) Il a été suggéré de publier la source de cette information que j'ai publiée, 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 à liaison tardive. Dans MVC 3, vous pouvez également utiliser une syntaxe un peu plus simple avec la propriété ViewBag pour atteindre le même objectif. 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é dynamique, vous pouvez simplement obtenir ou définir des propriétés et les résoudre dynamiquement 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 a été nommée propriété ViewModel.)

Rich Bianco
la source
La question demande la différence entre ViewDataet ViewBagpas ViewModel.
Matthew Flaschen
Merci pour le heads-up Matthew Flaschen, j'ai eu une faute de frappe dans la réponse et je l'ai corrigée, lit maintenant "ViewData" au lieu de ViewModel, ce qui était une erreur. :)
Rich Bianco
Maintenant, c'est incorrect. Aucun n'a été renommé en l'autre. Ils existent tous les deux. L'un est dynamicet soutient ViewBag.Message. On utilise l'ancienne ViewData["Message"]syntaxe.
Matthew Flaschen
1
+1 Mais, de quelle source citez-vous ...? Devrait vraiment fournir un lien.
Sam
1
Merci Sam pour la suggestion. J'ai ajouté un lien vers la source d'origine.
Rich Bianco
34

ViewBag vs ViewData dans MVC

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

Similitudes entre ViewBag et ViewData:

Aide à conserver les données lorsque vous passez du contrôleur à la vue. Utilisé pour passer des données du contrôleur à la vue correspondante. Une durée de vie courte signifie que la valeur devient nulle lorsque la redirection se produit. En effet, leur objectif est de fournir un moyen de communiquer entre les contrôleurs et les vues. C'est un mécanisme de communication au sein de l'appel serveur.

Différence entre ViewBag et ViewData:

ViewData est un dictionnaire d'objets dérivé de la classe ViewDataDictionary et accessible à l'aide de chaînes comme clés. ViewBag est une propriété dynamique qui tire parti des nouvelles fonctionnalités dynamiques de C # 4.0. ViewData nécessite une conversion de type pour les types de données complexes et vérifiez les valeurs nulles pour éviter les erreurs. ViewBag ne nécessite pas de transtypage pour les types de données complexes.

Exemple ViewBag & ViewData:

public ActionResult Index()
{   
    ViewBag.Name = "Arun Prakash";   
    return View();
}

public ActionResult Index()
{  
    ViewData["Name"] = "Arun Prakash";  
    return View();
}   

Appel en vue

@ViewBag.Name    
@ViewData["Name"]
Arun Prakash
la source
7
votre réponse l'indique typecastingmais vous n'avez pas montré comment le typage est effectué
Alex
31

ViewData: Il nécessite une conversion de type pour les types de données complexes et vérifie les valeurs nulles pour éviter les erreurs.

ViewBag: Il ne nécessite pas de conversion 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 Viewest 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
}

<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>
Naresh Ravlani
la source
6
aidez-moi à comprendre mais je pense qu'il y a une erreur. cela <h4>@ViewBag.emp.Name</h4> devrait changer<h4>@ViewBag.Employee.Name</h4>
Benny Margalit
24

Toutes les réponses suggèrent que ViewBaget / ou ViewDataconsiste à transmettre des données de ControlleràViews ce qui est la désinformation. les deux sont très utiles pour transmettre des données de vues à la mise en page ou partielles aux vues (ou ViewComponents, etc.) Ce n'est pas exclusif au contrôleur.

comme l'exemple asp.net par défaut ont ceci dans la page de mise en page:

<title>@ViewData["Title"] - MyApp</title>

et en tout point de vue

ViewData["Title"] = "Details";

Alors, pour poser la question: "quelle est la différence entre ViewBagetViewData ?"

La différence la plus notable ViewDataest un dictionnaire fortement typé ViewBag c'est un type dynamique.

Notez que les données à l'intérieur SONT LES MÊMES

ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";

Quand utiliser l'un ou l'autre?

  • ViewBagne prend pas en charge les noms C # non valides. vous ne pouvez pas accéder ViewData["Key With Space"]avecViewBag
  • ViewBag.Something est dynamique et vous pouvez rencontrer 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 nulls: ViewBag.Person?.Name
  • ViewDataavoir toutes les propriétés d'un dictionnaire comme ContainsKey, Addetc., donc vous pouvez utiliser ViewData.Add("somekey", "somevalue")garder à l'esprit qu'il peut lever des exceptions.
  • L'utilisation ViewDatasur les vues a besoin de TypeCasting alors ViewBagque non.

Connaître les différences subtiles, utiliser l'un ou l'autre est beaucoup plus une préférence gustative.

Normalement, vous pouvez penser ViewBag.AnyKeyà un alias deViewData["AnyKey"]

Bart Calixto
la source
14

Puis-je vous recommander de ne pas utiliser non plus?

Si vous souhaitez «envoyer» des données à votre écran, envoyez un objet fortement typé (AKA ViewModel) car il est plus facile à tester.

Si vous vous liez à une sorte de "modèle" et 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 être en mesure de restructurer et utilisez simplement ViewModels.

nootn
la source
4
En ignorant le principe du «compilateur est le premier test unitaire», comment un modèle de vue typé statiquement rend-il votre code plus testable qu'un type dynamique? Alors que l'exigence de tests est plus importante dans une solution à typage dynamique, si les deux solutions implémentent le même nombre et le même type de tests, vous ne perdez rien.
Darren Lewis
Je suis d'accord, c'est un peu vague. Peut-être que l'intellisense est impliqué.
Joshua Ramirez
1
Un exemple serait moqueur. Si vous voulez tester unitaire une action de contrôleur, il est plus facile de créer un objet "factice" pour le contourner et l'affirmer plutôt que d'essayer d'affirmer qu'une chaîne a été ajoutée à un dictionnaire ou qu'un champ dynamique a une valeur - c'est un concept similaire aux contrats de service ayant un objet "Demande" et un objet "Réponse", plutôt que de prendre plusieurs paramètres.
2013 à 12h08
comment transmettriez-vous les données de la vue à la mise en page si vous n'utilisez pas l'une ou l'autre? -1
Bart Calixto
Comment est-ce une réponse?
JSON
6

viewdata: est un dictionnaire utilisé pour stocker des données entre View et le contrôleur, vous devez convertir l' objet de données de vue en son modèle correspondant dans la vue pour pouvoir en extraire des données ...

ViewBag: est une propriété dynamique similaire dans son fonctionnement aux données de la vue, mais il vaut mieux qu'il ne soit pas nécessaire de le convertir en son modèle correspondant avant de l'utiliser dans la vue ...

Ahmed Elbatt
la source
4

Voici la différence point à point sur ViewData, ViewBag, TempData et Session. Crédit / copié askforprogram.in , suivez le lien pour l'exemple de code que je n'ai pas mentionné ici.

  1. ViewData dans MVC

    • ViewData est la propriété de la classe ControllerBase.
    • ViewData est un type d'objet dictionnaire.
    • ViewData est une collection de dictionnaires de valeurs-clés.
    • ViewData a été introduit dans la version MVC 1.0.
    • ViewData fonctionne avec .Net Framework 3.5 et supérieur.
    • Besoin de faire la conversion de type de code lors de l'énumération.
    • L'objet ViewData conserve les données uniquement pour la demande en cours.
  2. ViewBag dans MVC

    • ViewBag est la propriété de la classe ControllerBase.
    • ViewBag est un type d'objet dynamique.
    • ViewBag est un type d'objet.
    • ViewBag a été introduit dans la version MVC 3.0.
    • ViewBag fonctionne avec .Net Framework 4.0 et supérieur.
    • ViewBag utilise la propriété et la gère, donc pas besoin de faire de conversion de type lors de l'énumération.
    • L'objet ViewBag conserve les données uniquement pour la demande actuelle.
  3. TempData dans MVC

    • TempData est la propriété de la classe ControllerBase.
    • TempData est un type d'objet dictionnaire.
    • TempData est une collection de dictionnaires de valeurs-clés.
    • TempData a été introduit dans la version MVC 1.0.
    • TempData fonctionne avec .Net Framework 3.5 et supérieur.
    • Besoin de faire la conversion de type de code lors de l'énumération.
    • L'objet TempData est utilisé pour les données entre la demande en cours et la demande suivante.
  4. Session dans MVC

    • La session est la propriété du contrôleur (classe abstraite).
    • La session est un type de HttpSessionStateBase.
    • La session est une collection de dictionnaires de valeurs-clés.
    • La session a été introduite dans la version MVC 1.0.
    • TempData fonctionne avec .Net Framework 1.0 et supérieur.
    • Besoin de faire la conversion de type de code lors de l'énumération.
    • L'objet de session conserve les données de toutes les demandes. Valable pour toutes les demandes, n'expire jamais.
Nirju
la source
1

Bien que vous ne puissiez pas avoir un avantage technique à choisir un format plutôt qu'un autre, vous devez être conscient de 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 se compile pas. Un autre problème clé à considérer est que vous ne pouvez pas transmettre de valeurs dynamiques en tant que paramètres 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 dynamique, la compilation échouera. Par exemple, ce code échouera toujours: @ Html.TextBox ("nom", ViewBag.Name). Pour contourner ce problème, utilisez soit ViewData ["Nom"

user2211290
la source
0
public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

In View:

@ViewBag.Name 
@ViewData["Name"] 
dilipkumar1007
la source
0

De cette façon, nous pouvons lui faire utiliser les valeurs pour passer les informations entre le contrôleur à une autre page avec TEMP DATA

user3141962
la source
0

Une différence principale que j'ai remarquée entre ViewData et ViewBag est:

ViewData: il renverra l'objet, peu importe ce que vous lui avez attribué et vous devez retaper le type d'origine.

ViewBag: il est assez intelligent pour renvoyer le type exact ce que vous lui avez attribué peu importe la météo à laquelle vous avez attribué un type simple (c.-à-d. Int, chaîne, 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> products = new List<Products>();
            products.Add(p1);
            products.Add(p2);
            ViewBag.Countries = products;
            return View();
        }
    }
    public class Products
    {
        public int productId { get; set; }
        public string productName { get; set; }
    }
}

Afficher le code.

<ul>
            @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
            {
            <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

Écran OutPut.

entrez la description de l'image ici

Bhanu Pratap
la source
0

Afficher les données

  1. ViewData est utilisé pour transmettre les données du contrôleur à afficher
  2. ViewData est dérivé de la classe ViewDataDictionary et est essentiellement un objet Dictionary ieKeys et Values ​​où Keys sont String tandis que Values ​​seront des objets.
  3. La diffusion de types de données est requise lors de la récupération des données de ViewData en raison de son type de données Object et également de la vérification de la valeur nulle avant la conversion de type, sinon cela cassera l'application. 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

Jatin Phulera
la source
0
ViewData
  1. ViewData est utilisé pour transmettre les 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 une conversion de type pour les types de données complexes 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 respective
  2. ViewBag est une propriété dynamique qui tire parti des nouvelles fonctionnalités dynamiques de C # 4.0
  3. Il est également disponible pour la demande actuelle uniquement
  4. Si la redirection se produit, sa valeur devient nulle
  5. Ne nécessite pas de transtypage pour les types de données complexes
Er Pravin Suthar
la source
0

Ici, ViewData et ViewBag sont tous deux utilisés pour transmettre des données du contrôleur à la vue .

1. ViewData

- ViewData est un objet dictionnaire dérivé de la classe ViewDataDictonary .

- Les données ne permettent qu'une seule demande, les valeurs ViewData sont effacées lors de la redirection de page.

- La valeur ViewData doit être tapée cate avant utilisation.

Exemple: dans le contrôleur

public ActionResult PassingDatatoViewWithViewData()
{
      ViewData["Message"] = "This message shown in view with the ViewData";
      return View();
}

En vue

@ViewData["Message"];

- Avec ViewData est une paire comme Clé et Valeur , Message est Clé et en virgule inversée est Valeur.

- Les données sont simples, nous ne pouvons donc pas utiliser la conversion de type ici si les données sont complexes, alors utiliser la conversion de type.

public ActionResult PassingDatatoViewWithViewData()
{
      var type= new List<string>
    {
        "MVC",
        "MVP",
        "MVVC"
    };
    ViewData["types"] = type;
    return View();
}

- Les données In View peuvent être extraites

<ul>
        @foreach (var items in (List<string>)ViewData["types"])
        {
         <li>@items</li>
        }
  </ul>

2. ViewBag

--ViewBag utilise la fonctionnalité dynamique.Enveloppe ViewBag autour de ViewData.

- Dans le type de ViewBag, la conversion est requise.

- Identique à ViewData, si la redirection se produit, la valeur devient nulle.

Exemple:

public ActionResult PassingDatatoViewWithViewBag()
{
          ViewData.Message = "This message shown in view with the ViewBag";
          return View();
}

En vue

@ViewBag.vbMessage

--Pour le type complexe, utilisez ViewBag

public ActionResult PassingDatatoViewWithViewBag()
{
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewBag.types = type;
        return View();
 }

- Les données In View peuvent être extraites

<ul>
       @foreach (var items in ViewBag.types)
       {
         <li>@items</li>
       }
</ul>

- la principale différence est que ViewBag ne nécessite pas de transtypage mais ViewData est un transtypage requis.

Brijesh Mavani
la source
-1

ViewBag et ViewData sont deux moyens utilisés pour transmettre des informations du contrôleur à afficher dans ASP.Net MVC. Le but d'utiliser les deux mécanismes est de fournir la communication entre le contrôleur et View. Les deux ont une durée de vie courte, la valeur des deux devient nulle une fois la redirection effectuée, c'est-à-dire une fois que la page a été redirigée de la page source (où nous définissons la valeur de ViewBag ou ViewData) vers la page cible, ViewBag et ViewData devient nul.

Malgré 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 implémentations, nous constaterons que ViewData est une structure de données de dictionnaire - Dictionary of Objects dérivé de ViewDataDictionary et accessible à l'aide de chaînes comme clés de ces valeurs tandis que ViewBag utilise les fonctionnalités dynamiques introduites dans C # 4.0 et est une propriété dynamique.

2.) Lors de l'accès au formulaire de valeurs ViewData, nous devons transtyper les valeurs (types de données) car elles sont stockées en tant qu'objets dans le dictionnaire ViewData, mais cela n'est pas nécessaire si nous accédons à la valeur en cas de 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 valeur comme celle-ci

 @ViewData["Name"] 

Pour plus de détails, cliquez ici:

Abhishek Gahlout
la source
2
désolé d'avoir downvoté mais cette réponse prend plusieurs paragraphes pour ne rien dire d'utile. La chose utile qui manque dans la réponse acceptée serait la phrase "le sac de visionnement est une enveloppe dynamique autour des données de vue" que j'ai apprise de rachelappel.com/…
Chris F Carroll