理解基于对象列表的视图语法.净MVC

本文关键字:列表 视图 图语法 MVC 对象 于对象 | 更新日期: 2023-09-27 18:13:37

嗨,我使用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)。为什么上面用的是小m ?model(带小m)上面的意思是?IDE是如何知道model.name存在的(小写m)。

如果使用Model.Name,则意味着IEnumerable具有Name属性(对吗?)但事实并非如此,对吗?感谢为假人做的解释。那么什么是真正的model(小m)?

2)最后这个:

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

也令人困惑。modelItem是什么-没有在任何地方申报?它怎么会出现在这里?这是怎么回事?有item=> item.name不是更符合逻辑吗?

理解基于对象列表的视图语法.净MVC

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

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

这与MVC无关,如果你(真的)知道lambda表达式和匿名函数。这里modelItem是参数和项。Price是一个返回值。想象一下把它翻译成:

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

如果你直接调用它,这个函数将无法工作,因为它不知道。然而,lambda表达式使这成为可能,因为它们也可以从外部作用域引用变量。外部作用域是@foreach (var item in Model),它定义了

简而言之,您可以说在@Html.DisplayFor(modelItem => item.price)中根本不使用modelItem参数(也不需要声明它)。多亏了lambda)。事实上,如果你改变了那个项目。价格到modelItem。

如果您查看msdn上这两个方法的定义,您会发现它们是HTMLHelper类的扩展方法。所以,这些方法都意识到了"模型"。这个辅助方法需要一个lambda表达式作为参数。

下面是Expression<TDelegate>类,它代表一个委托。在本例中,委托是

Func<TModel, TValue>

TModel是一个输入参数,在本例中为"Model"类型。

现在"model"只是"model"的一个实例,你可以将它命名为任何东西,它将以同样的方式工作。

你需要进一步阅读匿名函数才能完全理解它。

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