C# @Html.DisplayNameFor()中的Lambda表达式
假设我正在将C# @Html.DisplayNameFor()中的Lambda表达式,c#,asp.net-mvc,lambda,C#,Asp.net Mvc,Lambda,假设我正在将人的列表作为模型传递给查看页面: @model IEnumerable<Foo.Models.Person> @foreach (var item in Model) { <p> @Html.DisplayFor(ListOfPersons => item.Id) : @Html.DisplayFor(ListOfPersons =>item.Name) </p> } @model IEnum
人的列表
作为模型传递给查看页面:
@model IEnumerable<Foo.Models.Person>
@foreach (var item in Model)
{
<p>
@Html.DisplayFor(ListOfPersons => item.Id) : @Html.DisplayFor(ListOfPersons =>item.Name)
</p>
}
@model IEnumerable
@foreach(模型中的var项目)
{
@DisplayFor(listopersons=>item.Id):@Html.DisplayFor(listopersons=>item.Name)
}
我只是不明白这个Lambda表达式是怎么工作的。为什么要传递一个IEnumerable
并在其对象上获取单个值?在razor中使用for循环,因此您可以保持对模型的直接引用:
@for(int i =0; i < Model.Count(); i++)
{
<p>
@Html.DisplayFor(model => model[i].Id) : @Html.DisplayFor(model => model[i].Name)
</p>
}
for(int i=0;imodel[i].Id):@Html.DisplayFor(model=>model[i].Name)
}
视图引擎将检查表达式,并确定您希望对Id
和Name
属性使用“显示”控件。它忽略“input”变量名(listopersons
*在本例中)和项
变量,只解析右侧的表达式。你也可以这样做:
@Html.DisplayFor(_ => item.Id) : @Html.DisplayFor(_ => item.Name)
*请注意,lambda中的
listopersons
并没有引用局部变量-它只是创建了一个新的“变量”,您可以在lambda中引用它。您似乎有一个名为listopersons
的属性或局部变量,这一事实与此无关 由于listopersons
不是声明的变量,只是表达式的参数名,因此表达式是有效的
简单地讲一下表达式,它们由一个参数集和一个主体组成
(parameter set) => (body)
例如,参数集可以是空的()
,或者包括一个或多个(x)
或(x,y)
。然后,主体可以使用这些参数,类似于方法主体使用传入参数的方式
@Html.DisplayFor(listopersons=>item.Id)
在显示的范围内使用时忽略该参数。它不使用它,类似于这样的东西
public int Id = 5;
public string DisplayFor(Person ListOfPersons)
{
return Id;
}
因此,您可以从这方面看到,没有使用参数,返回的值实际上是来自不同范围的值
DisplayFor的作用域是使用要绑定到的页面模型。因此,不管参数名如何,传入参数的将是模型。因此,由于参数在这里被完全忽略,因此它的名称并不特别重要,可以是()
或
然后返回的值是主体的值,在本例中是item.Id
和item.Name
。但是,由于没有使用该参数,因此呈现的html将不正确,即使显示的值看起来是准确的
为了解决这个问题,必须正确访问模型,否则呈现的html将不会绑定到post上。这通常是通过迭代和使用索引引用来完成的,如所示。这个问题可能会帮助您,感谢您提供完整的答案。我只是不明白为什么会有一个它不会用的论点
public int Id = 5;
public string DisplayFor(Person ListOfPersons)
{
return Id;
}