2013-02-06 57 views
1

我有一個問題,可能是很基本的,但我真的不明白這一點。所以它來了。Html.DisplayFor(或其他htmlhelpers)

如果我有一個視圖模板文件(.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)。

這裏(M => m.CurrentPage.MainBody)lambda表達式如何才能知道什麼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)是什麼上下文這裏嗎?什麼是指的?這在某個視圖中以某種方式「神奇地」連接到@model? (在這種情況下是@model PageViewModel<ArticlePage>「)

所以總結一下,在表達式中引用了什麼(m => m.CurrentPage.MainBody)?是否假設它是指提供的模型在經由@model視圖?

回答

4

如何這裏(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)的快捷方式,編譯器可以從上下文中推斷泛型參數,並且不需要顯式編寫它們。

+0

非常感謝。現在我明白了! –