为什么Razor甚至需要lambda表示法?

M. *_*ith 3 asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-5

我认为我对lambda符号的理解是缺乏的,因为我不明白为什么Razor甚至需要它.例如:

而不是这个:

@Html.DisplayFor(modelItem => item.FirstName)
Run Code Online (Sandbox Code Playgroud)

为什么我们不能这样做:

@Html.DisplayFor(item.FirstName)
Run Code Online (Sandbox Code Playgroud)

lambda语法的目的是什么?为什么我们需要添加输入lambda表示法的所有额外工作?

有人可以帮助我理解为什么需要它以及它提供什么好处?

Tet*_*oto 6

Razor视图中lambda表达式的目的是返回由匿名函数(即无名函数)模型给出的值.看看你的第一个例子:

@Html.DisplayFor(modelItem => item.FirstName)
Run Code Online (Sandbox Code Playgroud)

会被翻译成:

@Html.DisplayFor(String Function(Model modelItem) 
{ 
   return item.FirstName; 
})
Run Code Online (Sandbox Code Playgroud)

这里modelItem作为函数参数声明为Model,并返回语句作为函数体,根据get/set操作返回属性值.

如果我们进一步了解DisplayFor帮助声明:

public static MvcHtmlString DisplayFor<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression,
    string templateName
)
Run Code Online (Sandbox Code Playgroud)

正如@SLaks之前所述,表达式树可以被解析为一个参数,根据@model指令定义的模型类型而不是执行它来生成正确的HTML标记到视图中.

第二个参数Expression<Func<TModel, TValue>>是一个声明,它确保任何给定的函数参数始终与模型具有相同的类型.这种方式消除了反射代码,使用GetPropertyGetValue帮助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();
}
Run Code Online (Sandbox Code Playgroud)

然后,我们来看看第二个例子:

@Html.DisplayFor(item.FirstName) 
Run Code Online (Sandbox Code Playgroud)

这里DisplayForObject用作参数类型,考虑我们无法准确确定应该预先分配的类型,因此它设置为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中的lambda表达式(modelItem => item.FirstName)