为什么Razor中需要lambda表达式符号?

4
我认为我的Lambda符号理解不够,因为我不明白在Razor中为什么需要它。例如:

与其这样写:

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

为什么我们不能只有这个:
@Html.DisplayFor(item.FirstName)
lambda语法的目的是什么?为什么我们需要额外地打出lambda符号呢?
有人可以帮助我理解为什么需要这个,它提供了什么好处吗?

这实际上是MVC的一部分,而不是Razor。 - SLaks
2个回答

6
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>>是一个声明,确保任何给定的函数参数将始终具有与您的模型相同的类型。这种方式消除了反射代码,使用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();
}

之后,让我们来看第二个例子:
@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表达式


4
< p > < code > HtmlHelper 方法接受表达式树作为参数。

< p > 这使得它们可以查看您传递的实际属性,以便观察其属性。


无论如何,你都会发送参数,对吧? - M. Smith
抱歉,PropertyInfo是什么? - M. Smith
了解反射。请参阅 https://msdn.microsoft.com/zh-cn/library/system.reflection.propertyinfo。 - SLaks
3
如果传递一个原始值,函数就无法知道它来自哪个属性。 - SLaks
1
@M.Smith @Html.DisplayFor(item.FirstName)@Html.DisplayFor("First Name") 是一样的,但是这个方法怎么能从一个原始字符串 "First Name" 中知道属性信息呢? - Cheng Chen
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接