gpt4 book ai didi

c# - MVC 3 : HTML. DisplayFor 和 Lambda 表达式

转载 作者:太空狗 更新时间:2023-10-29 23:40:28 32 4
gpt4 key购买 nike

我找到了与此相关的其他主题,但没有一个让我明白我想弄清楚的是什么。

我正在研究 MVC 3,但我无法理解脚手架模板中与 @HTML.DisplayFor() 一起使用的 Lambda 表达式。

我正在使用 MvcMusicStore 示例应用程序,脚手架创建的 View 如下所示:

@model IEnumerable<MvcMusicStore.Models.Album>

...

@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Genre.Name)
</td>

我知道 DisplayFor 是 HTML 的扩展方法,它需要一个表达式作为参数。我研究了 Lambda 表达式并在其他上下文中理解它们,例如使用可枚举字符串。例如:

cities.Where(s => s.StartsWith("L"));

令我感到困惑的是,在第二个示例中,表达式 (s) 的第一部分实际上在第二部分 (s.startswith..) 中使用了,所以这是有道理的,我明白了程序是什么用它做。但在 MVC 3 View 中并非如此。 modelItem 未在任何地方使用。我尝试将“modelItem”重命名为这样的名称:

@Html.DisplayFor(iAmWearingShortPantsToday => item.Genre.Name)

此代码同样有效,可以正确显示所有项目和值。这让我怀疑在这种情况下“modelItem”实际上用于任何事情。但是,为什么它在那里?

我还尝试将此 Lambda 表达式转换为委托(delegate)(我认为这是委托(delegate)的缩写形式),如下所示:

@(Html.DisplayFor(delegate(IEnumerable<MvcMusicStore.Models.Album> modelItem) { return item.Genre.Name; }))

然而,这不起作用。产生的错误是:

CS1946:匿名方法表达式无法转换为表达式树

因此我的问题是:

“modelItem”有什么用? HTML.DisplayFor() 对 modelItem 做了什么?在其他情况下,表达式的第一部分是否变得重要?

如果可以将此表达式转换为适当的委托(delegate),那也可能有助于我理解到底发生了什么。

非常感谢

最佳答案

我理解你的困惑。实际上 modelItem 变量从未在 lambda 表达式中使用过。使用的是 item 变量,它是在来自外部上下文的闭包中捕获的。 item 变量只是在 foreach 循环中定义的局部变量。

顺便说一句,当您在 ASP.NET MVC View 中看到类似 modelItem => item.Genre.Name 的表达式时,这通常表示编码习惯不当。避开它。互联网上充斥着这样的坏例子。真的。我讨厌看到这个。请帮我根除这种做法。

这是实际使用变量的替代方法:

@model IList<MvcMusicStore.Models.Album>
...

@for (var i = 0; i < Model.Count; i++) {
<tr>
<td>
@Html.DisplayFor(x => x[i].Genre.Name)
</td>
...
</tr>
}

甚至更好。为什么要写循环?当我们可以直接使用编辑器/显示模板时:

@model IEnumerable<MvcMusicStore.Models.Album>
...
@Html.DisplayForModel()

然后定义一个显示模板,该模板将由 ASP.NET MVC 为模型集合的每个元素自动呈现 (~/Views/Shared/DisplayTemplates/Album.cshtml)

@model Album
<tr>
<td>
@Html.DisplayFor(x => x.Genre.Name)
</td>
...
</tr>

关于c# - MVC 3 : HTML. DisplayFor 和 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11687996/

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