【问题标题】:Why does this lambda expression work?为什么这个 lambda 表达式有效?
【发布时间】:2013-01-10 16:22:09
【问题描述】:

我找到了这个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 =&gt; model.ID),但不了解@Html.DisplayFor(modelItem =&gt; item.ID)

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

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

编辑

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

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

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

【问题讨论】:

  • 为什么第一个懂,第二个不懂?你也可以用任何单词替换model
  • 在这种情况下,您需要将model 的两个实例更改为相同的东西。所以我想我不完全理解它。我的印象是model 引用了第一行,它告诉它要使用哪个类/模型。需要解释一下吗?
  • 不,model 没有任何意义,因为 C# 区分大小写,而实际模型是 Model。在您的第一个 lambda 中,返回值取决于 lambda 参数。 (编译器知道参数是你的Model 类型。你实际上并没有传递你的Model,而是传递指令——要采用Model 的哪个属性。)这就是为什么它必须是相同的变量名左和右。在您的第二个 lambda 中,您想要的结果不取决于 lambda 参数,但您仍然必须传递一个参数。这就是为什么它的名字并不重要,它只是被丢弃了。
  • +1 得到了很好的回应。您应该考虑提交答案。

标签: asp.net-mvc razor


【解决方案1】:

它不起作用,因为item 已经在foreach 的外部范围内声明。

@foreach (var item in Model).

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

更新

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你确定这会起作用吗? modelItem 这是一个IEnumerable,它绝对没有属性 ID。这也是在 foreach 迭代中定义使用变量 item 的原因。
    • 这实际上是行不通的。我提供的代码是工作代码
    • 这里的IEnumerableModelmodelItem 仅在 lambda 中定义,因此此解决方案应该与提供的任何其他解决方案一样工作(它与@Html.DisplayFor(m =&gt; m.ItemId) 的公认解决方案相同)。
    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多