gpt4 book ai didi

c# - 'object' 不包含 'X' 的定义

转载 作者:IT王子 更新时间:2023-10-29 04:01:07 26 4
gpt4 key购买 nike

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

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' does not contain a definition for '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 View 由 ASP.NET 运行时自动编译成单独的程序集。这意味着您无法访问 Controller 中生成的任何匿名对象。

因此,为了解决您的问题,您可以定义一个 View 模型:

public class LanguageViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public string EnglishName { get; set; }
}

然后在你的 Controller 中使用这个 View 模型:

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

现在你有了一个 View 模型,对你的代码的下一个改进当然是摆脱我讨厌看到的 ViewBag 的废话,并简单地使用 View 模型和强类型:

public ActionResult Foo()
{
var model = db
.Languages
.Select(x => new LanguageViewModel
{
Name = x.Name,
EnglishName = x.EnglishName,
Id = x.Id
})
.ToList();
return View(model);
}

当然还有强类型 View :

@model IEnumerable<LanguageViewModel>
@Html.DisplayForModel()

然后定义相应的显示模板,该模板将由 ASP.NET MVC 引擎为 View 模型的每个元素自动呈现,这样您甚至不需要在 View 中编写一个 foreach (~/Views/Shared/DisplayTemplates/LanguageViewModel.cshtml):

@model LanguageViewModel
... generate the image or whatever you was attempting to do in the first place

关于c# - 'object' 不包含 'X' 的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7652749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com