Html.DisplayFor(或其他htmlhelpers)

时间:2013-02-06 17:13:44

标签: asp.net-mvc-3 razor

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

如果我有一个视图模板文件(.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 =&gt; 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 =&gt; n%2 == 1)的上下文是逻辑,lamdba表达式用于评估数字中的每个元素。

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

总结一下,表达式中m指的是什么(m =&gt; m.CurrentPage.MainBody)?它是否以某种方式假设它是通过@model引用视图中提供的模型?

1 个答案:

答案 0 :(得分:4)

  

这里的lambda表达式(m =&gt; 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)的快捷方式,编译器可以从上下文中推断出通用参数,而不需要明确地写它们。