“object”不包含“X”的定义

2023-12-26

我以前也遇到过一次这个问题,但没有解决。我有一个列表(在 MVC3 控制器中生成):

ViewBag.Languages = db.Languages
    .Select(x => new { x.Name, x.EnglishName, x.Id })
    .ToList();

在我的页面(Razor)上,我尝试迭代它:

foreach (var o in ViewBag.Languages)
{
    string img = "Lang/" + o.EnglishName + ".png";
    @* work *@
}

但参考o.EnglishName失败并出现错误:

“object”不包含“EnglishName”的定义

但奇怪的是,如果我在立即窗口中输入(在调试时):

o
{ Name = བོད་སྐད་, EnglishName = Tibetan, Id = 31 }
    EnglishName: "Tibetan"
    Id: 31
    Name: "བོད་སྐད་"

很明显,这个领域就在那里。我这里有什么问题吗?


您在这里使用匿名对象:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“object”不包含“X”的定义 的相关文章

随机推荐