Wil*_*Wil 26 c# asp.net-mvc lambda html-helper asp.net-mvc-3
我在很大程度上理解Lambda查询,但是当我尝试学习MVC,并且我看到默认的Scaffolding模板时,他们使用Lambda表达式来处理这么多组件.
例如,DisplayFor
HTML 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.Name
为ViewModel.ClientName
,Html.DisplayFor(x => model.Name)
则不会编译所有内容,因此请确保更改它们.如果你不使用lambda表达式,你的所有Html.Display()
调用都会起作用,但你会得到隐藏的错误,模型绑定不会立即显示错误.
要回答#2,原因与我对表达式树的描述相同.在不使用lambdas的情况下,你只是传递Model.Name
了没有关于属性本身的信息的值,所以它不知道Model.Name
属性的名称Name
,它看到的只是字符串值.
可以在此处找到表达树的另一个好的写法.理解表达式树在.Net中打开了很多力量:)
归档时间: |
|
查看次数: |
16098 次 |
最近记录: |