我在很大程度上理解 Lambda 查询,但是当我尝试学习 MVC 时,我看到了默认的脚手架模板,它们对很多组件使用 Lambda 表达式。
例如,DisplayFor
HTML Helper。代码为 @Html.DisplayFor(model => model.name)
我希望没有人认为这是一个愚蠢的问题,只是虽然我(认为我)大部分理解 Lambda 表达式,但它们不像常规代码那样“流动”,我必须仔细考虑很难理解实际发生了什么!
所以真正的问题是,
1) 对这些 HTML Helpers 使用 Lambda 查询,我是否遗漏了他们的任何好处?
2) 据我所知,DisplayFor 只会连接到一个项目 - 那么,为什么这不只是 @Html.DisplayFor(model.name)
或类似的?
请提供任何其他可以使 MVC 新手变得更好的信息!
最佳答案
在回答您的 2 个要点之前,我认为您需要了解 lambda 表达式的实际含义。
在.Net中,这样使用的Lambda表达式就是所谓的表达式树。来自 MSDN :
Expression trees represent code in a tree-like data structure, where each node is an expression, for example, a method call or a binary operation such as x < y.
这些本质上是描述传入内容的数据结构,而不是传入数据的值。这意味着当您调用 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()
调用都可以正常工作,但是您会遇到模型绑定(bind)的隐藏错误,这些错误不会立即显而易见。
回答#2,原因和我对表达式树的描述是一样的。如果不使用 lambda,您只是传递 Model.Name
的值而没有关于属性本身的信息,因此它不知道 Model.Name
属性的名称是 Name
,它看到的只是字符串值。
可以找到关于表达式树的另一篇很好的文章 here .理解表达式树可以在 .Net 中发挥巨大的作用 :)
关于c# - MVC HTML 帮助程序和 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5848940/