【问题标题】:using model in view, lambda expression explain在视图中使用模型,lambda 表达式解释
【发布时间】:2016-12-31 19:38:22
【问题描述】:

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

@model LoginViewModel

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

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

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

【问题讨论】:

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


【解决方案1】:

将编译给定的 Razor 模板,因此 Razor 视图编译器可以在这里发挥作用。

由于@model 指令,编译器知道您的模型的类型(没有@model 指令,编译器将退回到dynamic)。

如果您查看@Html.DisplayNameFor 指令,则Html 实例是HtmlHelper&lt;TModel&gt; 类型的对象,其中TModel@model 指令给出的类型。在您的情况下是具体类型HtmlHelper&lt;LoginViewModel&gt;

现在HtmlHelper&lt;LoginViewModel&gt;.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()。

    【讨论】:

      【解决方案3】:

      DisplayNameFor 是一个强类型 HTML 帮助器。这些是在ASP.NET MVC 2 中首次介绍的。它们的目的(根据链接的文章)是......

      ...提供了一种在视图模板中获得更好类型安全性的好方法。这样可以更好地在编译时检查您的视图(允许您在构建时而不是在运行时发现错误),并且在 Visual Studio 中编辑视图模板时还支持更丰富的智能感知。

      如果你想了解它们的工作原理,source code is available on GitHub

      【讨论】:

        猜你喜欢
        • 2018-04-18
        • 2018-09-11
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        相关资源
        最近更新 更多