【问题标题】:MVC HTML Helpers and Lambda ExpressionsMVC HTML 助手和 Lambda 表达式
【发布时间】:2011-08-16 11:26:42
【问题描述】:

我大部分都了解 Lambda 查询,但是当我尝试学习 MVC 时,我看到了默认的 Scaffolding 模板,它们对很多组件都使用 Lambda 表达式。

例如DisplayFor HTML Helper。代码为@Html.DisplayFor(model => model.name)

我希望没有人认为这是一个愚蠢的问题,只是虽然我(认为我)在很大程度上理解 Lambda 表达式,但它们不像常规代码那样“流动”,我必须好好考虑一下很难理解到底发生了什么!

所以问题真的是,

1) 对这些 HTML Helpers 使用 Lambda 查询,我是否缺少任何好处?

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

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

【问题讨论】:

  • 感谢 Wil,提出这个问题,我在学习 MVC 3 时一直在为同样的概念而苦苦挣扎

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


【解决方案1】:

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

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

表达式树表示树状数据结构中的代码,其中每个节点都是一个表达式,例如方法调用或二元运算,例如 x

这些本质上是描述传入什么而不是传入数据的值的数据结构。这意味着当您调用Html.DisplayFor(x => model.Name)时,它传入的数据结构显示“我正在调用此方法用于 xxxx 数据结构的 Name 属性(其中 xxxx 是表示您的视图模型的数据结构类型)。

DisplayFor 然后查看这个数据,发现属性名Name 是很好的名称,它查看该属性的所有属性以找出是否附加了任何数据注释,然后查看该值确定如何表示该值的显示。这有点复杂,直到您完全理解它,但是一旦您查看 MSDN 页面并考虑它,您就会有一个啊哈!像我一样的时刻,它会突然变得有意义:)

关于您的问题 #1,使用 lambda 表达式的优点是您可以在编译时检查您的属性。例如,如果您将ViewModel.Name 重命名为ViewModel.ClientName,则您的所有Html.DisplayFor(x => model.Name) 都不会编译,因此请确保更改它们。如果您不使用 lambda 表达式,那么您的所有 Html.Display() 调用都将起作用,但您会遇到模型绑定的隐藏错误,这些错误不会立即显而易见。

回答#2,原因和我对表达式树的描述一样。不使用 lambdas,你只是传入了Model.Name 的值,没有关于属性本身的信息,所以它不知道Model.Name 属性的名称是Name,它看到的只是字符串值。

可以在here 找到另一个关于表达式树的好文章。理解表达式树在 .Net 中打开了很多力量:)

【讨论】:

  • 感谢 KallDrexx 的解释,我在学习 MVC 3 时也一直在努力理解这个概念
  • 只使用@Model.name 会不会得到相同的结果?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多