Question

J'ai vu le ViewBag dans MVC 3. Comment est-ce différent de ViewData dans MVC 2?

Était-ce utile?

La solution

Il utilise la fonction dynamique C # 4.0. Il atteint le même objectif que vidéotex et devrait être évitée en faveur de l'utilisation des modèles fortement typés vue (de la même manière que vidéotex doit être évitée).

Donc, fondamentalement, il remplace chaînes magiques :

ViewData["Foo"]

avec propriétés magiques :

ViewBag.Foo

pour lequel vous avez pas la sécurité de compilation.

Je continue à blâmer Microsoft pour introduire jamais ce concept dans MVC.

Le nom des propriétés sont sensibles à la casse.

Autres conseils

interne ViewBag propriétés sont stockées sous forme de paires nom / valeur dans le champ Viewdata dictionnaire .

Remarque: dans la plupart des versions préliminaires de MVC 3, la propriété ViewBag a été nommé ViewModel comme indiqué dans cet extrait de MVC 3 notes de version:

(modifié 08/10/12) Il a été suggéré que je posterai la source de cette information que j'ai posté, est la source ici: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

  

MVC 2 contrôleurs prennent en charge un Viewdata   propriété qui permet de transmettre des données   à un modèle de vue à l'aide d'une liaison tardive   API dictionnaire. Dans MVC 3, vous pouvez aussi   utiliser une syntaxe un peu plus simple avec le   propriété ViewBag pour accomplir la   même but. Par exemple, au lieu de   écrit ViewData [ "Message"] = "text",   vous pouvez écrire ViewBag.Message = "text".   Vous n'avez pas besoin de définir une   classes fortement typé pour utiliser le   propriété ViewBag. Parce qu'il est   propriété dynamique, vous pouvez tout simplement au lieu   obtenir ou définir les propriétés et il sera   les résoudre dynamiquement au moment de l'exécution.   En interne, les propriétés sont ViewBag   stockées sous forme de paires nom / valeur dans la   dictionnaire ViewData. (Note: dans la plupart   pré-version versions de MVC 3, la   propriété ViewBag a été nommé   propriété ViewModel.)

ViewBag vs ViewData dans MVC

http://royalarun.blogspot.in/ 2013/08 / ViewBag-vidéotex-TempData-et-view.html

Similitudes entre ViewBag & ViewData:

  

Aide à maintenir des données lorsque vous passez de contrôleur à la vue. Habitué   transmettre des données de commande de vue correspondant. des moyens de vie courte   La valeur devient nulle lorsque la redirection se produit. En effet, leur but   est de fournir un moyen pour communiquer entre les contrôleurs et les vues. Ses   un mécanisme de communication au sein de l'appel du serveur.

Différence entre ViewBag et ViewData:

  

Viewdata est un dictionnaire d'objets qui est dérivé de   classe ViewDataDictionary et accessibles à l'aide de chaînes comme clés. ViewBag   est une propriété dynamique qui profite des nouvelles fonctionnalités de dynamiques   en C # 4.0. ViewData nécessite transtypage pour le type de données complexes et   vérifier les valeurs nulles pour éviter les erreurs. ViewBag ne nécessite pas   typecasting pour le type de données complexes.

ViewBag & ViewData Exemple:

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

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

Appel dans la vue

@ViewBag.Name    
@ViewData["Name"]

ViewData :. Il faut clichage pour les types de données complexes et la vérification des valeurs nulles pour les erreurs Évitez

ViewBag . Il ne nécessite pas coulée de 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 se présente comme suit:

@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>

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

que l'échantillon de 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 ViewBag et ViewData »

La différence la plus notable est ViewData est fortement typées Dictionnaire tout ViewBag est de type dynamique.

Notez que l'intérieur de données EST LE MÊME

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

Quand utiliser un ou l'autre?

  • ViewBag ne supporte pas les noms ne sont pas valables C #. vous ne pouvez pas accéder ViewData["Key With Space"] avec ViewBag
  • ViewBag.Something est dynamique et vous pouvez avoir des problèmes lors de l'appel des méthodes (comme les méthodes d'extension) qui a besoin de connaître le paramètre exact au moment de la compilation.
  • ViewBag peut vérifier nulls propre syntactique: ViewBag.Person?.Name
  • ViewData ont toutes les propriétés d'un dictionnaire comme ContainsKey, Add, etc. afin que vous puissiez utiliser garder à l'esprit de ViewData.Add("somekey", "somevalue") il peut lancer des exceptions.
  • Utilisation ViewData sur les vues a besoin typecasting tout ViewBag ne le font pas.

Connaître les différences subtiles, en utilisant un ou l'autre est beaucoup plus une préférence de goût.

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

Puis-je vous recommande de ne pas utiliser soit?

Si vous voulez des données « d'envoi » à l'écran, envoyer un objet fortement typé (ViewModel a.k.a.) parce qu'il est plus facile à tester.

Si vous liez à une sorte d'éléments « Modèle » et ont « au hasard » ou « ViewBag vidéotex » alors il fait le test automatique très difficile.

Si vous utilisez ces considèrent la façon dont vous pourriez être en mesure de ViewModels restructurer et juste utiliser.

Il y a quelques différences subtiles qui signifie que vous pouvez utiliser ViewData et ViewBag de façon légèrement différente de la vue. L'un des avantages 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 la coulée peut être évitée dans l'exemple en utilisant le ViewBag au lieu de ViewData.

vidéotex: est un dictionnaire utilisé pour stocker des données entre vue et le contrôleur, u besoin de jeter la vue objet de données à son modèle correspondant dans la vue de pouvoir récupérer les données qu'il ...

ViewBag: est une propriété dynamique similaire dans son fonctionnement aux données de vue, mais il vaut mieux cuz il n'a pas besoin d'être casté en son modèle corressponding avant de l'utiliser dans la vue .. .

Voici le point à la différence de points sur les ViewData, ViewBag, TempData & session. crédit / copié askforprogram.in , suivez le lien par exemple de code que je ne l'ai pas mentionné ici.

  1. ViewData dans MVC

    • ViewData est propriété de classe ControllerBase.
    • ViewData est un type d'objet dictionnaire.
    • ViewData est la valeur clé collection dictionnaire.
    • ViewData a été introduit dans la version 1.0 MVC.
    • ViewData travaille avec framework .Net 3.5 et au-dessus.
    • Nécessité de faire la conversion de type de code pendant l'énumération.
    • objet ViewData conserve les données uniquement pour la demande actuelle.
  2. ViewBag dans MVC

    • ViewBag est propriété de classe ControllerBase.
    • ViewBag est un type d'objet dynamique.
    • ViewBag est un type d'objet.
    • ViewBag a été introduit dans la version 3.0 MVC.
    • ViewBag travaille avec framework .Net 4.0 et au-dessus.
    • ViewBag utilise la propriété et les poignées, donc pas besoin de faire une conversion de type en énumérer.
    • objet ViewBag conserve les données uniquement pour la demande actuelle.
  3. TempData dans MVC

    • TempData est propriété de classe ControllerBase.
    • TempData est un type d'objet dictionnaire.
    • TempData est la valeur clé collection dictionnaire.
    • TempData a été introduit dans la version 1.0 MVC.
    • TempData travaille avec framework .Net 3.5 et au-dessus.
    • Nécessité de faire la conversion de type de code pendant l'énumération.
    • TempData objet est utilisé pour les données entre la demande actuelle et demande ultérieure.
  4. session dans MVC

    • Session est propriété de contrôleur (classe abstraite).
    • Session est un type de HttpSessionStateBase.
    • Session est la valeur clé collection dictionnaire.
    • Session a été introduit dans la version 1.0 MVC.
    • TempData fonctionne avec le framework .Net 1.0 et au-dessus.
    • Nécessité de faire la conversion de type de code pendant l'énumération.
    • objet session conserve les données pour toutes les demandes. Valable pour toutes les demandes, n'expire jamais.

Bien que vous ne pourriez pas avoir un avantage technique de choisir un format plus l'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é que vous accédons est valide C # identifi er. Par exemple, si vous placez une valeur dans Viewdata [ "Key Avec des espaces "], vous ne pouvez pas accéder à cette valeur à l'aide ViewBag parce que le code ne compilera pas. Une autre question clé à considérer est que vous ne pouvez pas passer des valeurs dynamiques comme paramètres des procédés 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 toujours l'échec: @ Html.TextBox ( "nom", ViewBag.Name). Pour contourner ce problème, soit utilisation ViewData [ "nom"] ou la fonte va

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 faire utiliser les valeurs à transmettre les informations entre le contrôleur à l'autre avec TEMP DATA

Une des principales différences que j'ai remarqué entre ViewData et ViewBag est:

ViewData:. Il retournera objet n'a pas d'importance ce que vous avez attribué cette question et besoin de typer à nouveau revenir au type d'origine

ViewBag: il est assez intelligent pour revenir taper exactement ce que vous lui avez attribuée ne vous avez pas MÉTÉO attribué type simple question (à savoir int, string, etc.) ou de type complexe

.

Ex.: Code 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 soRTie.

Voir les données

  1. Viewdata est utilisé pour transmettre des données à partir du contrôleur de vue
  2. ViewData est dérivé de la classe ViewDataDictionary et est essentiellement un objet dictionnaire i.e.Keys et valeurs contenant les clés chaîne tandis que les valeurs seront des objets.
  3. Les données typcasting est nécessaire lors de la récupération des données de ViewData en raison de son type d'objet de données et de contrôle aussi vValeur null befor de type coulée sinon il va briser l'application. Si la redirection se produit, sa valeur devient nulle Lire la différence complète entre TempData ViewData et Voir Sac

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

ViewData
  1. ViewData est utilisé pour transmettre des données de contrôleur à vue
  2. Il est dérivé de la classe ViewDataDictionary
  3. Il est disponible pour la demande en cours uniquement
  4. Nécessite typecasting pour le type de données complexes et la vérification des 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 profite des nouvelles fonctionnalités dynamiques en C # 4.0
  3. il est également disponible pour la demande en cours uniquement
  4. Si la redirection se produit, sa valeur devient nulle
  5. ne nécessite pas d'typecasting pour le type de données complexes

ici ViewData et ViewBag les deux sont des données passe d'occasion à partir Controller Afficher .

1. ViewData

-. ViewData est un objet de dictionnaire qui est dérivé de ViewDataDictonary class

-. Les données ne permettent que d'une demande, les valeurs vidéotex s'effacées lorsque la page de redirection se produit

-. Valeur ViewData doit être saisi certi avant d'utiliser

Exemple: Dans contrôleur

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

Dans la vue

@ViewData["Message"];

-. Avec ViewData est une paire comme Touche et Valeur , un message est la clé et la valeur de virgule inversée est la valeur

-. Les données sont simples pour que nous ne pouvons pas utiliser typecasting ici si les données sont complexes, puis en utilisant la coulée de type

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

- Dans Voir les données peuvent être extraites comme

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

2. ViewBag

-. ViewBag utilise l'enveloppe de feature.ViewBag de dynamique autour du ViewData

-. Dans le type ViewBag coulée est nécessaire

-. Comme 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();
}

Dans la vue

@ViewBag.vbMessage

- Pour le type Complexe utilisation ViewBag

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

- Dans Voir les données peuvent être extraites comme

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

-. La principale différence est que ViewBag pas nécessaire transtypage mais ViewData est nécessaire transtypage

ViewBag et Viewdata sont deux moyens qui sont utilisés pour transmettre des informations de commande pour afficher dans ASP.Net MVC. Le but d'utiliser à la fois le mécanisme est de fournir le communicaton entre le contrôleur et View. Les deux ont une courte vie qui est la valeur des deux devient nulle une fois que la redirection est survenue à savoir, une fois que la page a redirigé de la page source (où nous avons mis la valeur de ViewBag ou ViewData) à la page cible, tant ViewBag ainsi que ViewData devient nulle.

Malgré ces similitudes à la fois (ViewBag et vidéotex) sont deux choses différentes si l'on parle de la mise en œuvre des deux. Les différences sont les suivantes:

1) Si nous analysons sage à la fois la mise en œuvre alors nous constatons que ViewData est une structure de dictionnaire de données -. Dictionnaire des objets dérivés de ViewDataDictionary et accessibles à l'aide des chaînes comme clés à ces valeurs tout en ViewBag utilise la dynamique fonctionnalités introduites en C # 4.0 et est une propriété dynamique.

2.) Bien que l'accès aux VALUES ViewData, nous devons transtyper les valeurs (types de données) car ils sont stockés sous forme d'objets dans le dictionnaire ViewData, mais il n'y a pas besoin si nous accédons e valeur en cas de ViewBag.

3) En ViewBag nous pouvons définir la valeur comme ceci:.

      ViewBag.Name = "Value"; 

et l'accès peut comme suit:

          @ViewBag.Name

Alors que dans le cas de ViewData les valeurs peuvent être définies et accessibles comme suit:     Réglage ViewData comme suit:

ViewData["Name"] = "Value";

et la valeur accès comme ceci

 @ViewData["Name"] 

Pour plus de détails cliquez ici:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top