Razor视图中Lambda表达式的目的是从匿名函数(即无名称函数)返回模型给定的值。看一下您的第一个示例:
@Html.DisplayFor(modelItem => item.FirstName)
将被翻译成类似以下内容:
@Html.DisplayFor(String Function(Model modelItem)
{
return item.FirstName;
})
这里将modelItem
作为函数参数声明为Model
,并将返回语句作为函数体以返回根据get/set操作而定的属性值。
如果我们进一步查看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>>
是一个声明,确保任何给定的函数参数将始终具有与您的模型相同的类型。这种方式消除了反射代码,使用
GetProperty
和
GetValue
所需的HTML助手,以在适当的时间检索给定的属性值,以强类型模型为好处。
以下是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
我想了解@Html.DisplayFor(modelItem => item.FirstName)中的lambda表达式