【问题标题】:Html.DisplayFor ( or other htmlhelpers )Html.DisplayFor (或其他 htmlhelpers )
【发布时间】:2026-01-10 07:25:01
【问题描述】:

我有一个可能很基本的问题,但我真的不明白。所以它来了。

如果我有一个视图模板文件 ( .cshtml ) 并且有这样的代码行:

@Html.DisplayFor(m => m.CurrentPage.MainBody)

如果我查看 DisplayFor 的声明,它看起来像这样:

public static MvcHtmlString DisplayFor<TModel, TValue>(this HtmlHelper<TModel> html,      Expression<Func<TModel, TValue>> expression);

所以这是一个采用 Expression 参数的扩展方法,但 TModel 和 TValue 似乎是通用的(显然您可以将 lambda 表达式发送到 Expression)。

这里的 lambda 表达式 ( m => m.CurrentPage.MainBody ) 怎么知道 m 是什么?

如果我有这样的 lamdba 表达式:

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int oddNumbers = numbers.Count(n => n % 2 == 1);

那么 (n => n % 2 == 1) 的上下文是逻辑的,lamdba 表达式用于计算数字中的每个元素。

但在上述@Html.DisplayFor(m => m.CurrentPage.MainBody) 的情况下,这里的上下文是什么? m 指的是什么?在这个特定的视图中,这是否以某种方式“神奇地”连接到@model? (在这种情况下是@model PageViewModel&lt;ArticlePage&gt;")。

总而言之,表达式 (m => m.CurrentPage.MainBody) 中的 m 指的是什么?是否假定它以某种方式通过@model 引用视图中提供的模型?

【问题讨论】:

    标签: asp.net-mvc-3 razor


    【解决方案1】:

    这里的 lambda 表达式 ( m => m.CurrentPage.MainBody ) 怎么知道 m 是什么?

    Html.DisplayFor 帮助器的定义如下:

    public static MvcHtmlString DisplayFor<TModel, TValue>(
        this HtmlHelper<TModel> html, 
        Expression<Func<TModel, TValue>> expression
    )
    {
        ...
    }
    

    注意如何在强类型 HtmlHelper&lt;TModel&gt; 上调用此帮助程序。如果您没有带有模型的强类型视图,则不能使用 Html.DisplayFor 帮助器,因为您正在调用此扩展方法的 Html 只是 HtmlHelper 而不是 HtmlHelper&lt;TModel&gt;

    所以当你有一个模型时,在你的视图中:

    @model MyViewModel
    

    Html 属性的类型为 HtmlHelper&lt;MyViewModel&gt;,因此 DisplayFor 助手知道您的模型。

    基本上,当您有一个强类型视图时,Html.DisplayFor(m =&gt; m.CurrentPage.MainBody)Html.DisplayFor&lt;MyViewModel, TheTypeOfYourMainBodyProperty&gt;(m =&gt; m.CurrentPage.MainBody) 的快捷方式,编译器可以从上下文中推断出通用参数,而您无需显式编写它们。

    【讨论】:

    • 非常感谢。现在我明白了!