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助手所需的GetProperty
和GetValue
在適當的時間檢索給定屬性值並使用強類型模型作爲優點的反射代碼。
這裏是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)
這實際上是MVC,不是剃刀的一部分。 – SLaks