0

我找到了这个相关主题,但它没有回答我的问题。

当自动创建强类型视图时,假设使用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)

编辑

评论中提出了一个很好的观点。model只要您在 lambda 表达式的两侧进行更改,您似乎也可以更改为任何内容:

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

@model一个附带的问题是:顶部的语句如何影响下面的功能?我以前认为model引用@model表达式是为了通过类找出显示名称,但是在提到的更改之后页面仍然有效。

4

2 回答 2

1

它不起作用,因为item已经在foreach.

@foreach (var item in Model).

modelItem不使用 lambda的原因是因为IEnumerable. 如果有Test.Models.abcas model 而不是IEnumerable,那么那个 lambda 确实很重要,并且 的代码DisplayFor将更改为@Html.DisplayFor(m => m.ItemId).

更新

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

于 2013-01-09T20:29:49.863 回答
0

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

@Html.DisplayFor(modelItem => modelItem.ID)
于 2013-01-09T20:30:25.717 回答