嗨,我使用Visual Studio模板创建了视图,该视图应显示对象列表。这是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会更合乎逻辑吗?

最佳答案

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

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


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

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


现在,如果直接调用该函数将无法使用,因为它不了解item。但是,lambda表达式使之成为可能,因为它们也可以从外部范围引用变量。此处的外部范围是@foreach (var item in Model),用于定义项目。

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

关于c# - 了解基于对象的列表的 View 语法ASP.NET MVC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32689170/

10-12 04:36