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

时间:2016-08-24 15:16:29

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

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

@model LoginViewModel

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

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

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

3 个答案:

答案 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