为什么这个lambda表达式有效?

时间:2013-01-09 20:24:49

标签: asp.net-mvc razor

我找到了Related Topic,但未能回答我的问题。

当自动创建强类型视图时,假设使用List脚手架模板,我会得到类似于此的内容:

@model IEnumerable<Test.Models.abc>
<table>
    <tr>
    <th>
        @Html.DisplayNameFor(model => model.ID)
    </th>
</tr>

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.ID)
    </td>
</tr>
}
</table>

我完全了解@Html.DisplayNameFor(model => model.ID),但不是@Html.DisplayFor(modelItem => item.ID)

modelItem的目的是什么?用任意文本替换它将产生功能性网页。似乎modelItem只是一个遗漏的词。我想我真正的问题是为什么这不起作用?

@Html.DisplayFor(item => item.ID)

修改

评论中提出了一个很好的观点。只要你在lambda表达式的两边都改变它,你似乎也可以将model改为任何东西:

@Html.DisplayNameFor(abc => abc.ID)

一个侧面问题是:顶部的@model语句如何影响下面的函数?我之前认为model引用了@model表达式,以便通过类找出显示名称,但页面仍然可以在上述更改后工作。

2 个答案:

答案 0 :(得分:1)

它不起作用,因为item已在foreach的外部作用域中声明。

@foreach (var item in Model)

不使用modelItem lambda的原因是IEnumerable的迭代。如果Test.Models.abc作为模型而不是IEnumerable,那么lambda是否重要,DisplayFor的代码将更改为@Html.DisplayFor(m => m.ItemId)

<强>更新

@model IEnumerable<Test.Models.abc>只是声明此视图是强类型的,类型为IEnumerable<Test.Models.abc> - 在您的情况下。这意味着视图属性this.Model(不是model)的类型为IEnumerable<Test.Models.abc> - 并且该类型的模型也应传递到此视图中。上面示例中的model只是表达式变量 - 它只具有该表达式的作用域。您可以将其名称更改为尚未在外部作用域中使用的任何未受保护的合法变量名称(这就是为什么它不应该被命名为Model,因为它会隐藏已在视图中声明的Model属性)。

答案 1 :(得分:0)

item已经是外部范围中定义的变量。您将其捕获为闭包,这在这里并不理想。您的代码应该是:

@Html.DisplayFor(modelItem => modelItem.ID)