我应该如何解释这些lambda表达式?

时间:2015-04-06 04:37:13

标签: .net razor entity-framework-6

我正在学习如何使用.net实体框架,其中一个最让我困惑的表达方式就是这样:

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

在这个特定的例子中,我知道它显示了每个项目的注册日期,但我不理解表达式左侧的modelItem。据我所知,这是传递给操作员右侧函数的参数。但是,它没有在右侧使用,因此我无法理解其重要性。

2 个答案:

答案 0 :(得分:0)

嗯,DisplayFor是一个棘手的扩展。您必须阅读documentation才能理解它。

没有编译器或逻辑错误。如果您只需要为模型中的每个项目显示属性EnrollmentDate的值,那么给定的标记可以正常工作。

但是这里DispalyFor不会为控件生成正确的名称。因此,如果它仅用于显示它很好,但如果您想将输入元素的值作为模型发布,则必须在视图中进行更改。

您可能需要阅读thisthis,以便更好地了解模型绑定。

HTH。

答案 1 :(得分:0)

DisplayFor()扩展名定义为:

public static MvcHtmlString DisplayFor<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression  //pay attention to this part
)

这意味着,DisplayFor()会收到Experssion特定签名作为参数。签名是,表达式需要输入参数返回值

现在,在您的示例代码的上下文中说。代码中DisplayFor的参数读作“具有名为modelItem的输入参数且返回值item.EnrollmentDate”的表达式。因此,在这种情况下,modelItem不会影响表达式的输出,但需要将表达式识别作为输入参数因此被认为符合签名。