【问题标题】:using model in view, lambda expression explain在视图中使用模型,lambda 表达式解释
【发布时间】:2016-12-31 19:38:22
【问题描述】:
在以下VS2015的示例应用代码中:
@model LoginViewModel
<p>
@Html.DisplayNameFor(m => m.Name)
</p>
如果我从未说过m 是LoginViewModel 的别名,我想知道编译器如何知道m 指的是LoginViewModel。
我想帮助理解DisplayNameFor 的 lambda 表达式。如果我们可以只传递字符串m.Name,为什么它需要一个lambda?这里怎么用?
【问题讨论】:
标签:
c#
asp.net-mvc
lambda
html-helper
【解决方案1】:
将编译给定的 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 将无法获得所需的类型和验证注释(以及更多信息)。
【解决方案2】:
您的第一个问题:它将 LogonViewModel 传递给 @Html.DislplayNameFor 方法,因为您已在第一行将其定义为模型 (@model LoginViewModel)
正如这里提到的:
What is the @Html.DisplayFor syntax for?
Html.DisplayFor() 将呈现与
属性的类型。
如果找不到,我想它会调用 .ToString()。