1

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

如果我有一个视图模板文件 ( .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<ArticlePage>“)。

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

4

1 回答 1

4

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

Html.DisplayFor 帮助器定义如下:

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

注意这个帮助器只能在强类型上调用HtmlHelper<TModel>。如果您没有带有模型的强类型视图,则不能使用Html.DisplayFor帮助程序,因为Html您在其上调用此扩展方法是简单的HtmlHelper而不是HtmlHelper<TModel>.

因此,当您有模型时,在您的视图中:

@model MyViewModel

Html 属性是类型HtmlHelper<MyViewModel>,因此 DisplayFor 助手知道您的模型。

基本上,当您有一个强类型视图时,Html.DisplayFor(m => m.CurrentPage.MainBody)编译Html.DisplayFor<MyViewModel, TheTypeOfYourMainBodyProperty>(m => m.CurrentPage.MainBody)器可以从上下文中推断出通用参数,而您不需要显式地编写它们。

于 2013-02-06T17:18:25.650 回答