为什么在Razor中甚至需要使用lambda表示法?
我认为我对lambda表示法的理解是缺乏的,因为我不明白为什么它在Razor中甚至是需要的。例如:为什么在Razor中甚至需要使用lambda表示法?
,而不是这样的:
@Html.DisplayFor(modelItem => item.FirstName)
为什么我们不能仅仅有这样的:
@Html.DisplayFor(item.FirstName)
什么是lambda语法的目的,我们为什么需要添加输入lambda表示法的所有额外工作?
有人可以帮助我理解为什么这是必要的,它有什么好处?
HtmlHelper
方法将表达式树作为参数。
这让他们看到您传递的实际属性,以便他们可以观察其属性。
无论哪种方式,你发送的参数,虽然正确? –
是的,但是使用表达式树,您还可以看到“PropertyInfo”。否则,他们将无法使用格式化属性。 – SLaks
对不起,但PropertyInfo是什么? –
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