MVC HTML helper和Lambda表达式

本文关键字:Lambda 表达式 helper HTML MVC | 更新日期: 2023-09-27 17:53:57

我理解Lambda查询的大部分,但当我试图学习MVC,我看到默认的脚手架模板,他们使用Lambda表达式为这么多组件。

其中一个例子是DisplayFor HTML Helper。代码是@Html.DisplayFor(model => model.name)

我希望没有人认为这是一个愚蠢的问题,只是,虽然我(认为我)理解Lambda表达式的大部分,他们不"流"像常规代码,我不得不考虑它很难理解到底发生了什么!

所以问题是,

1)是否有任何好处,我错过了他们使用Lambda查询这些HTML助手?

2)据我所知,DisplayFor只会被连接到一个项目-所以,为什么这不是仅仅@Html.DisplayFor(model.name)或类似的?

并请给出任何其他信息,可以使MVC新手更好!

MVC HTML helper和Lambda表达式

在我回答你的两个要点之前,我认为你需要了解什么是lambda表达式。

在。net中,以这种方式使用的Lambda表达式被称为表达式树。从MSDN:

表达式树表示树状数据结构中的代码,其中每个节点是一个表达式,例如,一个方法调用或二进制操作,如x <y。>

这些本质上是描述传入的内容而不是传入的数据值的数据结构。这意味着当你调用Html.DisplayFor(x => model.Name)时,它传递了一个数据结构,说"我正在为xxxx数据结构的Name属性调用这个方法(其中xxxx是代表视图模型的数据结构类型)。

DisplayFor然后查看此数据并看到属性名称Name是well name,它查看该属性的所有属性以确定是否附加了任何数据注释,然后查看该值以确定如何表示该值的显示。它有点复杂,直到你得到你的头包裹它,但一旦你看了MSDN页面,并考虑它,你会有一个啊哈!就像我做的那样,它会突然变得有意义:)

关于您的问题#1,使用lambda表达式的优点是您可以在编译时检查属性。例如,如果将ViewModel.Name重命名为ViewModel.ClientName,则所有Html.DisplayFor(x => model.Name)都无法编译,因此请确保更改它们。如果你不使用lambda表达式,所有的Html.Display()调用都可以工作,但是你会得到模型绑定的隐藏bug,这些bug不会立即明显地看出是什么错了。

回答#2,原因与我对表达式树的描述相同。如果不使用lambdas,您只是传递Model.Name的值,而没有关于属性本身的信息,因此它不知道Model.Name属性的名称是Name,它所看到的只是字符串值。

另一个关于表达式树的好文章可以在这里找到。理解表达式树为。net提供了大量的功能:)

您确实可以使用类似于上面的替代选项。在这种情况下,它实际上是没有'For'部分的@Html.Display("name"),并以字符串形式传递模型的属性名称。这是一个不错的选择。如果你的属性名改变了,这将在运行时中断。

我喜欢lambdas,因为我是一个不断重命名的重构迷。通过打开视图编译,我可以依靠编译器来帮助我找到我需要更新我的视图的地方。