c# - 使用 View 中的模型,lambda表达式解释

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

在VS2015的示例应用程序的以下代码中:

@model LoginViewModel

<p>                               
 @Html.DisplayNameFor(m => m.Name)                                       
</p>

如果我从未说过 m 的别名,我想知道编译器如何知道 m 引用 LoginViewModel >LoginViewModel.

我希望帮助理解 DisplayNameFor 的 lambda 表达式。如果我们可以只传递字符串m.Name,为什么它需要一个 lambda?这里怎么用?

最佳答案

给定的 Razor 模板将被编译,因此 Razor View 编译器可以在这里发挥一些作用。

由于@model,编译器知道模型的类型。指令(如果没有 @model 指令,编译器会回退到 dynamic )。

如果你看@Html.DisplayNameFor指令,然后 Html实例是 HtmlHelper<TModel> 类型的对象哪里TModel@model 给出的类型指示。在你的情况下是具体类型 HtmlHelper<LoginViewModel> .

现在是HtmlHelper<LoginViewModel>.DisplayNameFor方法是强类型的,编译器可以认为 ' m ' (这只是一个参数名称)的类型为 LoginViewModel并且 lamdba 表达式从模型返回一个值。

在运行时 DisplayNameFor方法是通过提供模型对象作为参数'm来执行的' 表达式返回模型成员的对象(或表达式返回的对象),MVC 框架可以检查该对象(类型、验证属性等)并根据内部或自定义模板生成适当的 html。

如果您只传递一个字符串,那么 MVC 将无法获取所需的类型和验证注释(以及更多信息)。

关于c# - 使用 View 中的模型,lambda表达式解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39127195/

相关文章:

c# - 如何同时返回文件和强类型数据?

css - 如何在更大的屏幕尺寸下自动调整 _layout.cshtml?

c# - 调用lambda时 "DisplayClass"name是什么意思?

java - 使用 Lambda 表达式将字符串列表转换为 Java 中的自定义对象列表

c# - Visual Studio dll 创建故障排除

c# - 为什么我的客户端无法建立具有权限的 SSL/TLS 安全通道的信任关系?

c# - 尽管存在 dll,但无法识别 Tweetinvi 命名空间

c# - 允许特殊字符的正则表达式?

asp.net-mvc - 在 ASP.NET MVC3 中将复杂对象作为参数发送到 Post Action

转发通用引用的 C++ 存储函数