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新手更好!
在我回答你的两个要点之前,我认为你需要了解什么是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,因为我是一个不断重命名的重构迷。通过打开视图编译,我可以依靠编译器来帮助我找到我需要更新我的视图的地方。