Vous utilisez un objet anonyme ici:
ViewBag.Languages = db.Languages
.Select(x => new { x.Name, x.EnglishName, x.Id })
.ToList();
objets anonymes sont émis comme internal
par le compilateur. Les vues Razor sont automatiquement compilées dans un assembly séparé par le runtime ASP.NET. Cela signifie que vous ne pouvez accéder à aucun objet anonyme généré dans vos contrôleurs.
Ainsi, afin de résoudre votre problème, vous pouvez définir un modèle de vue:
public class LanguageViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public string EnglishName { get; set; }
}
puis dans l'utilisation du contrôleur ce modèle de vue:
ViewBag.Languages = db.Languages
.Select(x => new LanguageViewModel
{
Name = x.Name,
EnglishName = x.EnglishName,
Id = x.Id
})
.ToList();
Et maintenant que vous avez un modèle de vue l'amélioration suivante à votre code est bien sûr de se débarrasser de cette merde de ViewBag
que je suis malade de voir et d'utiliser simplement des modèles de vue et de forte typage:
public ActionResult Foo()
{
var model = db
.Languages
.Select(x => new LanguageViewModel
{
Name = x.Name,
EnglishName = x.EnglishName,
Id = x.Id
})
.ToList();
return View(model);
}
puis d'avoir bien entendu une vue fortement typé:
@model IEnumerable<LanguageViewModel>
@Html.DisplayForModel()
puis définir le modèle d'affichage correspondant qui sera rendu automatiquement par le moteur ASP.NET MVC pour chaque élément du modèle de vue afin que vous ne « t besoin même d'écrire une seule foreach dans votre point de vue (~/Views/Shared/DisplayTemplates/LanguageViewModel.cshtml
):
@model LanguageViewModel
... generate the image or whatever you was attempting to do in the first place
wow. réponse impressionnante (+1 pour cela). merci beaucoup - et oui, je suis en train de supprimer toutes les références à la ViewBag en faveur des modèles de vue ... – ekkis
très bien, mais nous pouvons avoir besoin de ViewBags parfois. Nous ne pouvons transmettre qu'un seul modèle à une seule vue. Cependant, nous pourrions vouloir envoyer d'autres petites collectes de données, n'est-ce pas? et dans ce cas, il est plus facile d'envoyer cette petite collection de données avec ViewBags. Bien sûr, vous pouvez également l'envoyer avec les vues partielles. Je ne sais pas s'il y a d'autres recommandations. – oneNiceFriend