我找到了有关此的其他主题,但没有一个让我了解我想要弄清楚的内容。
我正在研究 MVC 3,但我无法理解与脚手架模板中的 @HTML.DisplayFor() 一起使用的 Lambda 表达式。
我正在使用 MvcMusicStore 示例应用程序,脚手架创建的视图如下所示:
@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 视图中情况并非如此。modelItem 没有在任何地方使用。我尝试将“modelItem”重命名为:
@Html.DisplayFor(iAmWearingShortPantsToday => item.Genre.Name)
此代码也可以正常工作,正确显示所有项目和值。这让我怀疑在这种情况下“modelItem”实际上用于任何事情。但是,为什么它在那里?
我还尝试将此 Lambda 表达式转换为委托(我相信它是其缩写形式),如下所示:
@(Html.DisplayFor(delegate(IEnumerable<MvcMusicStore.Models.Album> modelItem) { return item.Genre.Name; }))
然而,这不起作用。产生的错误是:
CS1946:匿名方法表达式无法转换为表达式树
因此我的问题是:
“modelItem”有什么用?HTML.DisplayFor() 对 modelItem 有什么作用?是否还有其他情况,表达式的第一部分变得重要?
如果可以将此表达式转换为适当的委托,那也可能有助于我理解到底发生了什么。
非常感谢