Razor 视图上 lambda 表达式的目的是从匿名函数(即无名函数)返回模型给定的值。看看你的第一个例子:
@Html.DisplayFor(modelItem => item.FirstName)
会被翻译成这样的:
@Html.DisplayFor(String Function(Model modelItem)
{
return item.FirstName;
})
这里modelItem作为函数参数给出,声明为Model,return语句作为函数体返回属性值,具体取决于get/set操作。
如果我们进一步查看 DisplayFor 助手声明:
public static MvcHtmlString DisplayFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression,
string templateName
)
正如@SLaks 之前所说,表达式树可以被解析为一个参数,以根据@model 指令定义的模型类型生成适当的 HTML 标记到视图中,而不是执行它。
第二个参数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)