web-dev-qa-db-ja.com

MVCHTMLヘルパーとラムダ式

Lambdaクエリの大部分は理解していますが、MVCを学習しようとすると、デフォルトのScaffoldingテンプレートが表示され、非常に多くのコンポーネントにLambda式が使用されます。

たとえば、DisplayForHTMLヘルパーがあります。コードは@Html.DisplayFor(model => model.name)になります

これがばかげた質問だと誰も思わないことを願っています。ラムダ式はほとんど理解しているものの、通常のコードのように「流れる」ことはなく、理解するのが非常に難しいと考えなければなりません。実際に何が起こっているのか!

だから問題は本当に、

1)これらのHTMLヘルパーに対してLambdaクエリを使用することで、私が彼らに見逃している利点はありますか?

2)私が知る限り、DisplayForは1つのアイテムにしか接続されません。それでは、なぜこれは@Html.DisplayFor(model.name)または同様のものではないのですか?

そして、MVC初心者をより良くすることができる他の情報を教えてください!

26
Wil

2つの箇条書きに答える前に、ラムダ式が実際に何であるかを理解する必要があると思います。

.Netでは、このように使用されるラムダ式は、いわゆる式ツリーです。から [〜#〜] msdn [〜#〜]

式ツリーは、ツリーのようなデータ構造のコードを表します。各ノードは式であり、たとえば、メソッド呼び出しやx <yなどの二項演算です。

これらは基本的に、渡されるデータの値ではなく、渡されるものを記述するデータ構造です。これは、Html.DisplayFor(x => model.Name)を呼び出すと、「私はxxxxデータ構造のNameプロパティに対してこのメ​​ソッドを呼び出します(ここで、xxxxはビューモデルを表すデータ構造のタイプです)。

次に、DisplayForはこのデータを調べて、プロパティ名Nameが適切な名前であることを確認します。プロパティのすべての属性を調べて、データ注釈が添付されているかどうかを確認します。次に、値を調べて、値の表示を表す方法を決定します。頭を包み込むまでは少し複雑ですが、MSDNページを見て考えてみると、ああ!私がしたような瞬間、そしてそれは突然意味をなすでしょう:)

質問1に関して、ラムダ式を使用する利点は、プロパティのコンパイル時チェックを取得できることです。たとえば、_ViewModel.Name_の名前を_ViewModel.ClientName_に変更すると、すべてのHtml.DisplayFor(x => model.Name)がコンパイルされないため、必ず変更してください。ラムダ式を使用しない場合、すべてのHtml.Display()呼び出しは機能しますが、モデルバインディングに隠れたバグが発生し、何が問題なのかすぐにはわかりません。

#2に答えるために、理由は私の式ツリーの説明と同じです。ラムダを使用せずに、プロパティ自体に関する情報なしで_Model.Name_の値を渡すだけなので、_Model.Name_プロパティの名前がNameであることがわかりません。 seesは文字列値です。

式ツリーのもう1つの優れた記述は、 ここ にあります。式ツリーを理解することで、.Netに大きな力が生まれます:)

23
KallDrexx

上記と同様の代替手段を使用するオプションがあります。この場合、実際には「For」部分がなく、モデルのプロパティ名が文字列として渡された@Html.Display("name")になります。これはOKの代替手段です。プロパティ名が変更された場合、これは実行時に壊れます。

私は常に名前を変更するリファクタリング中毒者なので、ラムダが好きです。 ビューのコンパイルをオンにする 次に、コンパイラを利用して、ビューを更新する必要がある場所を見つけることができます。

6
ataddeini