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は一般的なようです(ラムダ式を式に送信できるようです)。

ここでのラムダ式(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

ここのラムダ式 ( 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 に答える