我在很大程度上理解Lambda查询,但是当我尝试学习MVC,并且我看到默认的Scaffolding模板时,他们使用Lambda表达式来处理这么多组件。
例如,DisplayFor
HTML帮助程序。代码为@Html.DisplayFor(model => model.name)
我希望没有人认为这是一个愚蠢的问题,只是虽然我(我认为)在大多数情况下理解Lambda表达式,但它们并不像常规代码那样“流动”而我必须要考虑它很难理解实际发生的事情!
所以问题确实是,
1)对于使用这些HTML帮助程序的Lambda查询,我是否缺少任何好处?
2)据我所知,DisplayFor只会连接到一个项目 - 所以,为什么这不仅仅是@Html.DisplayFor(model.name)
或类似的?
请提供任何其他可以让MVC新手更好的信息!
答案 0 :(得分:23)
在回答你的2个要点之前,我认为你需要了解实际上是什么lambda表达式。
在.Net中,以这种方式使用的Lambda表达式就是所谓的表达式树。来自MSDN:
表达式树表示树状数据结构中的代码,其中每个节点是表达式,例如,方法调用或二进制操作,例如x<收率
这些本质上是描述传入内容而不是传入数据值的数据结构。这意味着当您调用Html.DisplayFor(x => model.Name)
时,它传递的数据结构为“I”我正在为xxxx数据结构的Name属性调用此方法(其中xxxx是表示View模型的数据结构的类型)。
然后DisplayFor
查看此数据并看到属性名称Name
是名称,它会查看属性的所有属性,以查明是否附加了任何数据注释,然后查看该值以确定如何表示值的显示。这有点复杂,直到你把头缠在它上面,但是一旦你看到MSDN页面并想一想,你就会有一个啊哈!像我一样的时刻,它会突然变得有意义:))
关于你的问题#1,使用lambda表达式的好处是你可以获得属性的编译时检查。例如,如果您将ViewModel.Name
重命名为ViewModel.ClientName
,则所有Html.DisplayFor(x => model.Name)
都无法编译,因此请确保更改它们。如果你不使用lambda表达式,那么你所有的Html.Display()
调用都会起作用,但你会得到隐藏的模型绑定错误,这些错误不会立即显示错误。
要回答#2,原因与我对表达式树的描述相同。不使用lambda,你只是传递Model.Name
的值而没有关于属性本身的信息,所以它不知道Model.Name
属性的名称是Name
,它看到了是字符串值。
可以找到表达树的另一个好的写作here。理解表达式树在.Net中打开了很多力量。)
答案 1 :(得分:6)
您可以选择使用替代方法,类似于上面的内容。在这种情况下,它实际上是@Html.Display("name")
没有'For'部分,并且模型的属性名称作为字符串传入。这是一个不错的选择。如果您的属性名称发生更改,但这会在运行时中断。
我喜欢lambdas因为我是一个不断重命名的重构瘾君子。通过turning on view compilation我可以依靠编译器来帮助我找到更新视图所需的位置。