【问题标题】:Why is lambda notation even needed in Razor?为什么 Razor 甚至需要 lambda 表示法?
【发布时间】:2016-07-28 19:09:38
【问题描述】:

我认为我缺乏对 lambda 表示法的理解,因为我不明白为什么 Razor 甚至需要它。例如:

而不是这个:

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

为什么我们不能只拥有这个:

@Html.DisplayFor(item.FirstName)

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

有人可以帮助我了解为什么需要这样做以及它有什么好处吗?

【问题讨论】:

  • 这实际上是 MVC 的一部分,而不是 Razor。

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-5


【解决方案1】:

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&lt;Func&lt;TModel, TValue&gt;&gt; 是一个声明,可确保任何给定的函数参数始终与您的模型具有相同的类型。这种方式消除了使用 HTML 助手所需的 GetPropertyGetValue 的反射代码,以便在适当的时候以强类型模型检索给定的属性值。

下面是 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)

【讨论】:

    【解决方案2】:

    HtmlHelper 方法将表达式树作为参数。

    这让他们可以看到您传递的实际属性,以便他们可以观察其属性。

    【讨论】:

    • 不管怎样,你发送的参数是对的吗?
    • 是的,但是使用表达式树,您还可以看到PropertyInfo。否则,他们将无法使用格式化属性。
    • 抱歉,PropertyInfo 是什么?
    • 如果你传递一个原始值,函数无法知道它来自什么属性。
    • @M.Smith @Html.DisplayFor(item.FirstName)@Html.DisplayFor("First Name") 相同,该方法如何从原始字符串“First Name”中知道属性信息?
    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2015-09-02
    • 2016-09-24
    • 1970-01-01
    相关资源
    最近更新 更多