Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# @Html.DisplayNameFor()中的Lambda表达式_C#_Asp.net Mvc_Lambda - Fatal编程技术网

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;
}