C# 了解基于对象列表的视图语法ASP.NET MVC

C# 了解基于对象列表的视图语法ASP.NET MVC,c#,asp.net-mvc,C#,Asp.net Mvc,您好,我使用Visual Studio模板创建了视图,该模板应显示对象列表。以下是Visual Studio生成的语法: @model IEnumerable<TestMVCApplication.Models.Product> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <p> @Html.ActionLink("Create New", "Create") </p>

您好,我使用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>
我知道参考模型时,我们应该使用
模型
大写字母M)。
为什么上面的代码与小的
m
一起使用?什么是
型号
(带小m) 上面是什么意思?IDE如何知道
model.name
存在(带有小m)

如果使用
Model.Name
,则意味着
IEnumerable
具有属性
Name
(对吗?),但情况并非如此?感谢对假人的解释。
那么什么才是真正的
模型
(带小m)

2) 最后,这是:

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

这也令人困惑。什么是
modelItem
——它没有在任何地方声明?它怎么会出现在这里?这是怎么回事?如果您查看msdn上这两个方法的定义,您会发现它们是HTMLHelper类的扩展方法。因此,这些方法都知道“模型”。此帮助器方法需要一个lambda表达式作为参数

下面是哪一个
表达式
类,它表示一个委托。在这种特殊情况下,委托是

Func

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

现在“model”只是“model”的一个实例,您可以将其命名为任何名称,它将以相同的方式工作

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


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

@Html.DisplayFor(modelItem => item.price)
如果您(真的)了解lambda表达式和匿名函数,那么这与MVC无关。这里modelItem是参数,item.price是返回值。想象一下,将此转换为:

TypeOfPriceProp AnonymousFunction(SomeType modelItem) {
   return item.price;
}
现在,如果您直接调用此函数,它将无法工作,因为它不知道项的相关信息。然而,lambda表达式使之成为可能,因为它们也可以引用外部范围中的变量。这里的外部范围是
@foreach(模型中的var项)
,它定义了


简而言之,您可以说在
@Html.DisplayFor(modelItem=>item.price)
modelItem参数根本没有被使用(也不需要声明。多亏了lambda)。事实上,如果将item.price更改为modelItem.price,它将无法工作。

此处使用的model和modelItem只是lambda函数的参数名。你甚至可以随意给它命名,比如m或mitem。只要在google中查找一些关于Lambda表达式的信息。@Thangadurai:如果我能写任何东西,它怎么知道这里:
model=>model.available
表示
model.available
-属性存在??你的解释也非常少,我在问之前做了基础研究。把你的模型对象产品贴在这里。请注意,扩展方法DisplayNameFor实际上需要一个IEnumerable。你真的需要在谷歌上搜索一下数据注释、方法扩展,并检查一下MSDN中那些HTML助手类的语法。@Thangadurai:那么你已经在谷歌上搜索过了,不能向我解释答案了吗?我告诉过你我在问之前已经搜索过了。这是一个模型:
public-class-Product{public-string-name{get;set;}public-int-ID{get;set;}public-bool-available{get;set;}public-int-price{get;set;}
@Thangadurai:那么它期望IEnumerable?那么
model
IENumerable吗?就像我说的,我认为你应该总是在campital M中使用
Model
。此外,即使Model是
IEnumerable
,为什么
Model.Name
有意义?如果
Model
Model
的实例,那么
Model
IEnumerable
类型,对吗?为什么
IEnumerable
具有类似
的属性???另外,如果我在html
model
中使用,您确定不会出现语法错误吗?(带小m)@用户30044,人们正在尽最大努力提供更好的答案。对于这样的论坛,你的“语气”听起来不太好。我看不出这有什么不对answer@Thangadurai当前位置因为我花了时间和精力制定了一个问题,提供答案的人也应该如此。我同意@Thangadurai。OP,问这个问题是你的需要,所以你必须努力做初始rnd,格式化等,每个人都必须这样做。回答这个问题是你要求的帮助。所以,请体贴和礼貌。事实上,SO指南中也提到了这一点。@vnikhil:这是一个完全错误的答案,所以我在这里没有更多的补充。无论如何,对这个答案的评论已经够多了,我认为它不再值得了。好的,我想我理解第二个问题的解释-谢谢。但第一个问题仍然不清楚!是的,你的第一个问题真的很有趣。正因为如此,事情变得扑朔迷离了。:)是的,但正如你所看到的,到目前为止还没有人回答?!我不知道如何增加对这个问题的关注,你在19个小时前问了这个问题,有大约50个观点。虽然这是低,只是给它一些时间。我也开始学习MVC,你的第一个问题也会对我有所帮助。同时,为什么不调试(我相信razor可以调试)并在运行时检查“模型”中的内容呢。我的意思是它的类型、值等等。我在调试器中看不到那个值
TypeOfPriceProp AnonymousFunction(SomeType modelItem) {
   return item.price;
}