2011-05-01 23 views
25

我理解Lambda查询的大部分内容,但是当我尝试学习MVC并且看到默认的Scaffolding模板时,它们将Lambda表达式用于这么多组件。MVC HTML Helpers和Lambda表达式

其中一个例如是DisplayFor HTML助手。代码去@Html.DisplayFor(model => model.name)

我希望没有人认为这是一个愚蠢的问题,它只是,虽然我(想我)大部分理解Lambda表达式,他们不像普通代码“流动”,我有想想很难理解实际发生的事情!

所以,真正的问题是,

1)是否有使用lambda查询这些HTML助手,我很想念他们任何好处?

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

请给出任何其他信息,可以使MVC新手更好!

+2

感谢Wil,为了提出这个问题,我一直在努力学习MVC 3 – 2011-05-19 03:21:31

回答

6

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

我喜欢lambda,因为我是一个不断重新命名的重构迷。通过turning on view compilation我可以依靠编译器来帮助我找到我需要更新视图的位置。

+0

+这个链接! – ANeves 2011-11-28 18:53:09

23

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

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

表达式树表示在一树状数据结构,其中每个节点是一个表达式的代码,例如,一个方法调用或为x < Y A二进制运算等。

这些基本上描述什么是不是在传递数据的值传递的数据结构。这意味着,当你调用Html.DisplayFor(x => model.Name)它传递的数据结构,上面写着“我是呼吁XXXX数据结构的名称属性此方法(其中xxxx是代表您的视图模型的数据结构的类型)。

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中打开了很大的力量:)

+0

感谢KallDrexx对此的解释,我一直在努力理解这个概念以及学习MVC 3 – 2011-05-19 03:22:39

+0

不仅仅使用'@ Model.name'会得到相同的结果吗? – 2013-11-28 15:21:01