我有一个问题,可能是非常基本的,但我真的不明白。所以来了。
如果我有一个视图模板文件(.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引用视图中提供的模型?
答案 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)
的快捷方式,编译器可以从上下文中推断出通用参数,而不需要明确地写它们。