[英]Lambda expression in @Html.DisplayNameFor()
假設我正在將“ Person
List
”作為模型傳遞給視圖頁面:
@model IEnumerable<Foo.Models.Person>
@foreach (var item in Model)
{
<p>
@Html.DisplayFor(ListOfPersons => item.Id) : @Html.DisplayFor(ListOfPersons =>item.Name)
</p>
}
我只是不知道這個Lambda表達式如何工作。 為什么我們要傳遞IEnumerable
並在其對象上獲得單個值?
由於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.Id
和item.Name
。 但是,由於沒有使用該參數,因此即使顯示的值看起來是准確的,呈現的html也將是不正確的。
為了解決這個問題,必須正確訪問模型,否則渲染的html不會在發布時綁定。 這通常是通過迭代和使用索引引用來完成的,如@Jonespolis的answer所示。
在剃須刀中使用for循環,因此您可以直接引用模型:
@for(int i =0; i < Model.Count(); i++)
{
<p>
@Html.DisplayFor(model => model[i].Id) : @Html.DisplayFor(model => model[i].Name)
</p>
}
@Html.DisplayFor(ListOfPersons => item.Id) : @Html.DisplayFor(ListOfPersons =>item.Name)
視圖引擎將檢查表達式,並確定您要“顯示” Id
和Name
屬性的控件。 它忽略“輸入”變量名稱(在這種情況下為ListOfPersons
*)和item
變量,僅解析右側的表達式。 您也可以這樣做:
@Html.DisplayFor(_ => item.Id) : @Html.DisplayFor(_ => item.Name)
*請注意,您的lambda中的ListOfPersons
不會引用局部變量-它只是創建一個可以在lambda中引用的新 “變量”。 您似乎擁有一個名為ListOfPersons
的屬性或局部變量的ListOfPersons
是無關緊要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.