在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/