Ответ 1
Вы используете анонимный объект здесь:
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