在视图中使用模型,lambda 表达式解释
using model in view, lambda expression explain
VS2015示例应用代码如下:
@model LoginViewModel
<p>
@Html.DisplayNameFor(m => m.Name)
</p>
我想知道如果我从未说过 m
是 LoginViewModel
的别名,编译器如何知道 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。
VS2015示例应用代码如下:
@model LoginViewModel
<p>
@Html.DisplayNameFor(m => m.Name)
</p>
我想知道如果我从未说过 m
是 LoginViewModel
的别名,编译器如何知道 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。