2016-07-28 41 views
2

我認爲我對lambda表示法的理解是缺乏的,因爲我不明白爲什麼它在Razor中甚至是需要的。例如:爲什麼在Razor中甚至需要使用lambda表示法?

,而不是這樣的:

@Html.DisplayFor(modelItem => item.FirstName) 

爲什麼我們不能僅僅有這樣的:

@Html.DisplayFor(item.FirstName) 

什麼是lambda語法的目的,我們爲什麼需要添加輸入lambda表示法的所有額外工作?

有人可以幫助我理解爲什麼這是必要的,它有什麼好處?

+0

這實際上是MVC,不是剃刀的一部分。 – SLaks

回答

4

HtmlHelper方法將表達式樹作爲參數。

這讓他們看到您傳遞的實際屬性,以便他們可以觀察其屬性。

+0

無論哪種方式,你發送的參數,雖然正確? –

+0

是的,但是使用表達式樹,您還可以看到「PropertyInfo」。否則,他們將無法使用格式化屬性。 – SLaks

+0

對不起,但PropertyInfo是什麼? –

6

Razor視圖上的lambda表達式的用途是由匿名函數(即無名函數)的模型返回的值。看看你的第一個例子:

@Html.DisplayFor(modelItem => item.FirstName) 

將被轉換爲類似:

@Html.DisplayFor(String Function(Model modelItem) 
{ 
    return item.FirstName; 
}) 

這裏modelItem的聲明爲Model功能參數和返回語句中給出的函數體根據返回的屬性值在獲取/設置操作。

如果我們進一步看向DisplayFor幫手聲明:

public static MvcHtmlString DisplayFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression, 
    string templateName 
) 

正如@SLaks之前,表達式樹可以被解析爲參數說明,以生成型模型的基於正確的HTML標籤到視圖定義通過@model指令而不是執行它。

第二個參數Expression<Func<TModel, TValue>>是一個聲明,它確保任何給定的函數參數始終與您的模型具有相同的類型。這種方式消除了使用HTML助手所需的GetPropertyGetValue在適當的時間檢索給定屬性值並使用強類型模型作爲優點的反射代碼。

這裏是HTML輔助聲明內部反射代碼的例子,其可以通過lambda語法來消除:

var model = html.ViewData.Model; 
var value = String.Empty; 

if (model != null) 
{ 
    var type = typeof(TModel); 
    var propertyInfo = type.GetProperty(templateName); 
    var propertyValue = propertyInfo.GetValue(model); 
    value = propertyValue.ToString(); 
} 

之後,讓我們檢查第二個例子:

@Html.DisplayFor(item.FirstName) 

這裏DisplayFor將使用Object作爲參數類型,考慮我們不能確定應該預先分配哪種類型,因此它設置爲System.Object。由於該方法不提供泛型代碼中的模型定義類型TModel,因此該方法在處理屬性值時可能需要反射。

歡迎任何改進和建議。

參考文獻:

https://msdn.microsoft.com/en-us/library/hh833706%28v=vs.118%29.aspx

http://odetocode.com/blogs/scott/archive/2012/11/26/why-all-the-lambdas.aspx

I want to understand the lambda expression in @Html.DisplayFor(modelItem => item.FirstName)

相關問題