理解基于View MVL的对象列表

时间:2015-09-21 07:04:02

标签: c# asp.net-mvc

您好我使用Visual Studio模板创建了View,它应该显示对象列表。以下是Visual Studio生成的语法:

@model IEnumerable<TestMVCApplication.Models.Product>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.available)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.price)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.available)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.price)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}

</table>

我对上面的语法感到困惑。特别:

1)我们第一次看到上述情况:

   @Html.DisplayNameFor(model => model.name)

我知道要引用模型我们应该使用Model使用大写M )。 为什么它上面使用了小mmodel(小m)是什么 意思是上面? IDE如何知道model.name存在(小m)。

如果使用Model.Name,则意味着IEnumerable具有属性Name(对吗?)但情况并非如此吗?对虚拟对象的解释赞赏。那么真正的model(小m)是什么?

2)最后:

@Html.DisplayFor(modelItem => item.name)

也令人困惑。什么是modelItem - 它没有在任何地方宣布?怎么会出现在这里?这是怎么回事?拥有item=> item.name

是不合逻辑的

2 个答案:

答案 0 :(得分:0)

我没有掌握MVC,但我可以澄清你的第二个问题。

@Html.DisplayFor(modelItem => item.price)

如果你(真的)知道lambda表达式和匿名函数,那么这与MVC无关。这里modelItem是参数,item.price是返回值。想象一下将其翻译为:

TypeOfPriceProp AnonymousFunction(SomeType modelItem) {
   return item.price;
}

如果您直接调用此功能,因为它不知道项目,此函数将无效。但是,lambda表达式使它成为可能,因为它们也可以引用外部作用域中的变量。这里的外部范围是@foreach (var item in Model),它定义

简而言之,你可以说在@Html.DisplayFor(modelItem => item.price)中根本没有使用modelItem参数(也不需要声明它。感谢lambda)。实际上,如果您将item.price更改为modelItem.price,则无效。

答案 1 :(得分:-1)

如果您在msdn上查看这两个方法的定义,您会发现它们是HTMLHelper类的扩展方法。所以,这些方法都知道“模型”。此辅助方法需要将lambda表达式作为参数。

以下是哪一项 Expression<TDelegate>类,它代表一个委托。在这个特殊情况下,代表是

Func<TModel, TValue>

TModel是一个输入参数,在这种情况下类型为“Model”。

现在“模型”只不过是“模型”的一个实例,你可以将它命名为任何东西,它将以相同的方式工作。

您需要进一步阅读匿名函数以完全理解它。

https://msdn.microsoft.com/en-us/library/bb397687.aspx