MVC HTML助手和Lambda表达式

Wil*_*Wil 26 c# asp.net-mvc lambda html-helper asp.net-mvc-3

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

例如,DisplayForHTML Helper 就是一个例子.代码去了@Html.DisplayFor(model => model.name)

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

所以问题确实是,

1)对于使用Lambda查询这些HTML帮助程序,我有什么好处吗?

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

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

Kal*_*exx 23

在回答你的2个要点之前,我认为你需要了解lambda表达式实际上是什么.

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

表达式树表示树状数据结构中的代码,其中每个节点是表达式,例如,方法调用或二进制操作,例如x <y.

这些本质上是数据结构,用于描述传入的内容而不是传入的数据的值.这意味着当您调用Html.DisplayFor(x => model.Name)它时会传入一个数据结构,其中显示"我正在为Name属性调用此方法xxxx数据结构的位置(其中xxxx是表示View模型的数据结构的类型).

DisplayFor随后看着这个数据并看到属性名Name非常名,它着眼于所有属性的属性,以查明是否有连接到它的任何数据的注释,然后在数值看,以确定如何代表显示器为了价值.这有点复杂,直到你把头缠在它上面,但是一旦你看到MSDN页面并想一想,你就会有一个啊哈!就像我做的那样,它会突然变得有意义:)

至于您的问题#1,使用lambda表达式的优点是您可以对属性进行编译时检查.例如,如果重命名ViewModel.NameViewModel.ClientName,Html.DisplayFor(x => model.Name)则不会编译所有内容,因此请确保更改它们.如果你不使用lambda表达式,你的所有Html.Display()调用都会起作用,但你会得到隐藏的错误,模型绑定不会立即显示错误.

要回答#2,原因与我对表达式树的描述相同.在不使用lambdas的情况下,你只是传递Model.Name了没有关于属性本身的信息的值,所以它不知道Model.Name属性的名称Name,它看到的只是字符串值.

可以在此处找到表达树的另一个好的写法.理解表达式树在.Net中打开了很多力量:)


ata*_*ini 6

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

我喜欢lambdas,因为我是一个不断重命名的重构瘾君子.通过打开视图编译,我可以依靠编译器来帮助我找到更新视图所需的位置.