您在这里使用匿名对象:
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