Вы используете анонимный объект здесь:
ViewBag.Languages = db.Languages
.Select(x => new { x.Name, x.EnglishName, x.Id })
.ToList();
Анонимные объекты испускаются компилятором как internal
. Представления Razor автоматически компилируются в отдельную сборку средой выполнения ASP.NET. Это означает, что вы не можете получить доступ к любым анонимным объектам, сгенерированным в ваших контроллерах.
Таким образом, чтобы решить вашу проблему, вы можете определить модель представления:
public class LanguageViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public string EnglishName { get; set; }
}
и затем в вашем контроллере используйте эту модель представления:
ViewBag.Languages = db.Languages
.Select(x => new LanguageViewModel
{
Name = x.Name,
EnglishName = x.EnglishName,
Id = x.Id
})
.ToList();
И теперь, когда у вас есть модель представления, следующим улучшением вашего кода, конечно же, является избавление от этого дерьма из ViewBag
, которое мне надоело видеть, и просто использование моделей представления и строгой типизации:
public ActionResult Foo()
{
var model = db
.Languages
.Select(x => new LanguageViewModel
{
Name = x.Name,
EnglishName = x.EnglishName,
Id = x.Id
})
.ToList();
return View(model);
}
и, конечно, строго типизированное представление:
@model IEnumerable<LanguageViewModel>
@Html.DisplayForModel()
и затем определите соответствующий шаблон отображения, который будет автоматически отображаться механизмом ASP.NET MVC для каждого элемента модели представления, чтобы вам даже не нужно было писать один foreach в ваших представлениях (~/Views/Shared/DisplayTemplates/LanguageViewModel.cshtml
) :
@model LanguageViewModel
... generate the image or whatever you was attempting to do in the first place