c# - MVC HTML 帮助程序和 Lambda 表达式

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

我在很大程度上理解 Lambda 查询,但是当我尝试学习 MVC 时,我看到了默认的脚手架模板,它们对很多组件使用 Lambda 表达式。

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

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

所以真正的问题是,

1) 对这些 HTML Helpers 使用 Lambda 查询,我是否遗漏了他们的任何好处?

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

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

最佳答案

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

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

Expression trees represent code in a tree-like data structure, where each node is an expression, for example, a method call or a binary operation such as x < y.

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

DisplayFor 然后查看此数据并看到属性名称 Name 是 Name,它查看该属性的所有属性以找出是否有任何附加到它的数据注释,然后查看该值以确定如何表示该值的显示。在您全神贯注之前,它有点复杂,但是一旦您查看 MSDN 页面并思考它,您就会大吃一惊!像我一样的时刻,它会突然变得有意义:)

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

回答#2,原因和我对表达式树的描述是一样的。如果不使用 lambda,您只是传递 Model.Name 的值而没有关于属性本身的信息,因此它不知道 Model.Name 属性的名称是 Name,它看到的只是字符串值。

可以找到关于表达式树的另一篇很好的文章 here .理解表达式树可以在 .Net 中发挥巨大的作用 :)

关于c# - MVC HTML 帮助程序和 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5848940/

相关文章:

c# - 为什么这个ajax调用失败了?

.net - 设置响应状态代码会导致自定义错误页面顶部出现不需要的错误文本

asp.net-mvc-3 - MVC 3将无法从Areas子文件夹提供内容文件

asp.net-mvc - 我应该如何保护我的 SPA 和 Web.API?

asp.net-mvc-3 - ASP.NET MVC 3 中 DropDownListFor 的数据绑定(bind)错误?

java - 将我的 asp.net mvc Web 应用程序与基于 Java 的开源 BPM(业务流程管理)软件集成

c# - 如何将面板添加到 SplitContainer?

c# - 使用数据绑定(bind),根据 ComboBox 中选定的时区在文本框中显示时间

c# - 如何在存储过程中遍历数组,返回数组?

javascript - 检测与 JQuery 数据表的交互