Lambdaクエリの大部分は理解していますが、MVCを学習しようとすると、デフォルトのScaffoldingテンプレートが表示され、非常に多くのコンポーネントにLambda式が使用されます。
たとえば、DisplayFor
HTMLヘルパーがあります。コードは@Html.DisplayFor(model => model.name)
になります
これがばかげた質問だと誰も思わないことを願っています。ラムダ式はほとんど理解しているものの、通常のコードのように「流れる」ことはなく、理解するのが非常に難しいと考えなければなりません。実際に何が起こっているのか!
だから問題は本当に、
1)これらのHTMLヘルパーに対してLambdaクエリを使用することで、私が彼らに見逃している利点はありますか?
2)私が知る限り、DisplayForは1つのアイテムにしか接続されません。それでは、なぜこれは@Html.DisplayFor(model.name)
または同様のものではないのですか?
そして、MVC初心者をより良くすることができる他の情報を教えてください!
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に大きな力が生まれます:)
上記と同様の代替手段を使用するオプションがあります。この場合、実際には「For」部分がなく、モデルのプロパティ名が文字列として渡された@Html.Display("name")
になります。これはOKの代替手段です。プロパティ名が変更された場合、これは実行時に壊れます。
私は常に名前を変更するリファクタリング中毒者なので、ラムダが好きです。 ビューのコンパイルをオンにする 次に、コンパイラを利用して、ビューを更新する必要がある場所を見つけることができます。