在视图中使用模型,lambda 表达式解释

using model in view, lambda expression explain

VS2015示例应用代码如下:

@model LoginViewModel

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

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

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

您的第一个问题:它将 LogonViewModel 传递给 @Html.DislplayNameFor 方法,因为您已在第一行将其定义为模型 (@model LoginViewModel)

正如这里提到的那样: What is the @Html.DisplayFor syntax for?

Html.DisplayFor() will render the DisplayTemplate that matches the property's type.

If it can't find any, I suppose it invokes .ToString().

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

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

如果您查看 @Html.DisplayNameFor 指令,那么 Html 实例是类型 HtmlHelper<TModel> 的对象,其中 TModel 是由 @model 指令。你的情况是具体类型 HtmlHelper<LoginViewModel>.

现在 HtmlHelper<LoginViewModel>.DisplayNameFor 方法是强类型的,编译器可以计算出“m”(它只是一个参数名称)的类型是 LoginViewModel 并且 lamdba 表达式returns 来自模型的值。

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

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

DisplayNameFor 是一个 强类型 HTML 帮助器 。这些是在 ASP.NET MVC 2 中首次引入的。它们的目的(根据链接文章)是...

...provide a nice way to get better type-safety within your view templates. This enables better compile-time checking of your views (allowing you to find errors at build-time instead of at runtime), and also supports richer intellisense when editing your view templates within Visual Studio.

如果您想了解它们的工作原理,source code is available on GitHub