MVC HTML助手和Lambda表达式

时间:2011-05-01 14:18:08

标签: c# asp.net-mvc asp.net-mvc-3 lambda html-helper

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

例如,DisplayFor HTML帮助程序。代码为@Html.DisplayFor(model => model.name)

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

所以问题确实是,

1)对于使用这些HTML帮助程序的Lambda查询,我是否缺少任何好处?

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

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

2 个答案:

答案 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我可以依靠编译器来帮助我找到更新视图所需的位置。