【发布时间】:2012-07-26 03:26:27
【问题描述】:
我找到了与此相关的其他主题,但没有一个能让我理解我想要弄清楚的内容。
我正在研究 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 有什么作用?是否还有其他情况,表达式的第一部分变得重要?
如果可以将此表达式转换为适当的委托,那也可能有助于我理解到底发生了什么。
非常感谢
【问题讨论】:
标签: c# asp.net-mvc asp.net-mvc-3