@ Html.DisplayNameFor()中的Lambda表达式

时间:2015-08-19 19:43:34

标签: c# asp.net-mvc lambda

假设我将Person @model IEnumerable<Foo.Models.Person> @foreach (var item in Model) { <p> @Html.DisplayFor(ListOfPersons => item.Id) : @Html.DisplayFor(ListOfPersons =>item.Name) </p> } 作为模型传递给视图页面:

IEnumerable

我只是不了解这个Lambda表达式的工作原理。为什么我们传递 SELECT t.*, IF(@first=t.id, @flag := @flag+1,@flag:=1) `flag`, @first:=t.id FROM (SELECT coalesce(fx.rate,1) `rate`, (r.value * coalesce(fx.rate,1)) as converted, r.*, fx.base,fx.target, fx.avg_date, fx.rate frate FROM monthly_revenue r LEFT JOIN currencies ON r.currency_id = currencies.id LEFT JOIN (SELECT AVG(rate) `rate`, `base`, `target`, STR_TO_DATE(CONCAT('1/',MONTH(rate_date),'/',YEAR(rate_date)), '%d/%m/%Y') avg_date FROM foreign_exchange GROUP BY `base`, `target`, `avg_date` ) fx ON currencies.name = fx.base AND fx.target = 'USD' AND fx.avg_date <= STR_TO_DATE(CONCAT('1/',r.month,'/',r.year), '%d/%m/%Y') ORDER BY r.id, fx.avg_date DESC) t HAVING `flag` = 1 并在其对象上获得单个值?

3 个答案:

答案 0 :(得分:2)

由于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中所示。

答案 1 :(得分:1)

在剃刀中使用for循环,因此您可以直接引用模型:

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

答案 2 :(得分:1)

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

视图引擎将检查表达式并确定您想要&#34;显示&#34; IdName属性的控件。它忽略了&#34;输入&#34;变量名(本例中为ListOfPersons *)和item变量,只解析右侧的表达式。你也可以这样做:

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

*请注意,lambda中的ListOfPersons不会引用局部变量 - 它只会创建一个 new &#34;变量&#34;你可以在你的lambda中引用。您似乎拥有名为ListOfPersons的属性或局部变量这一事实无关紧要。