在以下VS2015示例应用程序的代码中:
@model LoginViewModel
<p>
@Html.DisplayNameFor(m => m.Name)
</p>
如果我从未说过m
是LoginViewModel
的别名,我想知道编译器如何知道m
引用LoginViewModel
。
我想帮助理解DisplayNameFor
的lambda表达式。如果我们可以传递字符串m.Name
,为什么它需要lambda?这是怎么用的?
答案 0 :(得分:3)
将编译给定的Razor模板,因此Razor视图编译器可以在这里做一些魔术。
由于@model
指令(没有@model指令,编译器回退到dynamic
),编译器知道模型的类型。
如果查看@Html.DisplayNameFor
指令,则Html
实例是HtmlHelper<TModel>
类型的对象,其中TModel
是@model
给出的类型指令。在您的情况下,具体类型为HtmlHelper<LoginViewModel>
。
现在HtmlHelper<LoginViewModel>.DisplayNameFor
方法是强类型的,编译器可以认为'm
'(只是一个参数名)的类型为LoginViewModel
,并且lamdba表达式返回一个来自模型的价值。
在运行时期间,通过提供模型对象作为参数“DisplayNameFor
”来执行m
方法,表达式返回模型成员的对象(或表达式返回的对象),MVC框架可以检查对象(类型,验证属性等)并根据内部或自定义模板生成相应的html。
如果您只是传递一个字符串,那么MVC将无法获得所需的类型和验证注释(以及更多信息)。
答案 1 :(得分:0)
您的第一个问题:它将LogonViewModel
传递给@Html.DislplayNameFor
方法,因为您已在第一行将其定义为模型(@model LoginViewModel
)
如上所述: What is the @Html.DisplayFor syntax for?
Html.DisplayFor()将呈现与之匹配的DisplayTemplate 财产的类型。
如果找不到,我想它会调用.ToString()。
答案 2 :(得分:0)
DisplayNameFor
是强类型HTML帮助程序。这些最初是在ASP.NET MVC 2中引入的。它们的目的(根据链接的文章)是......
...提供了一种在视图模板中获得更好的类型安全性的好方法。这样可以更好地编译视图的编译时间(允许您在构建时而不是在运行时查找错误),并且在Visual Studio中编辑视图模板时也支持更丰富的智能感知。
如果您想了解它们的工作方式,请source code is available on GitHub。