簡體   English   中英

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

[英]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.Iditem.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) 

視圖引擎將檢查表達式,並確定您要“顯示” IdName屬性的控件。 它忽略“輸入”變量名稱(在這種情況下為ListOfPersons *)和item變量,僅解析右側的表達式。 您也可以這樣做:

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

*請注意,您的lambda中的ListOfPersons不會引用局部變量-它只是創建一個可以在lambda中引用的 “變量”。 您似乎擁有一個名為ListOfPersons的屬性或局部變量的ListOfPersons是無關緊要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM