J'ai vu ViewBag
dans MVC 3. En quoi est-ce différent de ViewData
MVC 2?
J'ai vu ViewBag
dans MVC 3. En quoi est-ce différent de ViewData
MVC 2?
Réponses:
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.
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.)
ViewData
et ViewBag
pas ViewModel
.
dynamic
et soutient ViewBag.Message
. On utilise l'ancienne ViewData["Message"]
syntaxe.
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"]
typecasting
mais vous n'avez pas montré comment le typage est effectué
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 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
}
<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>
<h4>@ViewBag.emp.Name</h4>
devrait changer<h4>@ViewBag.Employee.Name</h4>
Toutes les réponses suggèrent que ViewBag
et / ou ViewData
consiste à 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 ViewBag
etViewData
?"
La différence la plus notable ViewData
est 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?
ViewBag
ne 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
ViewData
avoir toutes les propriétés d'un dictionnaire comme ContainsKey
, Add
etc., donc vous pouvez utiliser ViewData.Add("somekey", "somevalue")
garder à l'esprit qu'il peut lever des exceptions.ViewData
sur les vues a besoin de TypeCasting alors ViewBag
que 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"]
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.
Il existe quelques différences subtiles qui signifient que vous pouvez utiliser ViewData et ViewBag de manières légèrement différentes 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 le ViewBag au lieu de ViewData.
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 ...
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.
ViewData dans MVC
ViewBag dans MVC
TempData dans MVC
Session dans MVC
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"
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 lui faire utiliser les valeurs pour passer les informations entre le contrôleur à une autre page avec TEMP DATA
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 @item.productName</li>
}
</ul>
Écran OutPut.
Afficher les données
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
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.
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: