2015-08-19 181 views
1

比方说,我传递PersonList作为模型视图页面:Lambda表达式()

@model IEnumerable<Foo.Models.Person> 

@foreach (var item in Model) 
{ 
    <p> 
     @Html.DisplayFor(ListOfPersons => item.Id) : @Html.DisplayFor(ListOfPersons =>item.Name) 
    </p>  
} 

我只是不明白这Lambda表达式是如何工作的。为什么我们传递IEnumerable并获得单个对象的值?

+0

这个问题也许可以帮助你http://stackoverflow.com/questions/6365633/what-is-the-html-displayfor-syntax-for – Rikard

回答

1

由于ListOfPersons不是已声明的变量,只是表达式的参数名称,所以表达式是有效的。

要短暂地触及表达式,它们由参数集和正文组成。

(parameter set) => (body) 

参数组可以是空的或()包括1个或多个参数(x)(x,y)例如。然后,主体可以使用这些参数,类似于方法主体将如何使用传入的参数。

@Html.DisplayFor(ListOfPersons => item.Id)当在所示范围中使用时,将忽略该参数。它不使用它,类似于这样的事情

public int Id = 5; 
public string DisplayFor(Person ListOfPersons) 
{ 
    return Id; 
} 

所以你可以从这个方面看,该参数不使用,返回的值实际上是从一个不同的范围值。

DisplayFor的作用域为使用页面的模型绑定到。因此,无论参数名称如何,传入参数的内容都将成为模型。因此,由于该参数在此处被完全忽略,所以它并不特别关心它的命名,并且可以简单地是()_

返回的值是来自正文的值,在此例中为item.Iditem.Name。但是,由于没有使用参数,所呈现的html将不正确,即使所显示的值看起来是准确的。

为了解决这个问题,必须正确访问模型,否则所呈现的html将不会在发布后绑定。这通常通过迭代和使用索引引用完成,如@Jonespolis' answer中所示。

+0

感谢您的完整答案。我只是困惑,为什么它会得到一个它不会使用的论点 – Yar

1

使用在剃刀循环,让你保持一个直接的参考模型:

@for(int i =0; i < Model.Count(); i++) 
{ 
    <p> 
    @Html.DisplayFor(model => model[i].Id) : @Html.DisplayFor(model => model[i].Name) 
    </p>  
} 
1
@Html.DisplayFor(ListOfPersons => item.Id) : @Html.DisplayFor(ListOfPersons =>item.Name) 

的视图引擎将检查表情,并确定要“显示”控制IdName属性。它会忽略“输入”变量名称(本例中为ListOfPersons *)和item变量,只是解析右边的表达式。你也可以同样这样做:

@Html.DisplayFor(_ => item.Id) : @Html.DisplayFor(_ => item.Name) 

*请注意您的拉姆达是ListOfPersons不引用一个局部变量 - 它只是创建了一个新的“变量”,你可以在你的拉姆达引用。事实上,你似乎有一个名为ListOfPersons的属性或局部变量是无关紧要的。