2015-08-19 222 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的屬性或局部變量是無關緊要的。