MVC HTML助手和Lambda表达式

我在很大程度上理解Lambda查询,但是当我尝试学习MVC时,我看到了默认的Scaffolding模板,他们使用Lambda表达式来处理这么多组件。

例如, DisplayFor HTML Helper就是其中之一。 代码为@Html.DisplayFor(model => model.name)

我希望没有人认为这是一个愚蠢的问题,只是因为我(我认为)在大多数情况下理解Lambda表达式,它们并不像常规代码那样“流动”,我不得不考虑它很难理解实际发生了什么!

所以问题确实是,

1)使用Lambda查询为这些HTML帮助程序,我是否有任何好处?

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

请提供任何其他可以使MVC新手更好的信息!

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

在.Net中,以这种方式使用的Lambda表达式就是所谓的表达式树。 来自MSDN :

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

这些本质上是数据结构,用于描述传入的内容而不是传入的数据的值。这意味着当您调用Html.DisplayFor(x => model.Name)它传入的数据结构是说:“我正在为xxxx数据结构的Name属性调用此方法(其中xxxx是表示View模型的数据结构的类型)。

然后DisplayFor查看这些数据并看到属性名称Name是好的Name,它查看属性的所有属性,以查明是否附加了任何数据注释,然后查看该值以确定如何表示显示值。 这有点复杂,直到你把头缠在它上面,但是一旦你看到MSDN页面并想一想,你就会有一个啊! 像我一样的时刻,它会突然变得有意义:)

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

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

可以在此处找到表达树的另一个好的写法。 理解表达式树在.Net中打开了很多力量:)

您可以选择使用替代方法,类似于上面的方法。 在这种情况下,它实际上是@Html.Display("name")没有’For’部分,并且模型的属性名称作为字符串传入。 这是一个不错的选择。 如果您的属性名称发生更改,但这会在运行时中断。

我喜欢lambdas,因为我是一个不断重命名的重构瘾君子。 通过启用视图编译,我可以依靠编译器来帮助我找到更新视图所需的位置。