MVC では、プロパティのエディターまたはプロパティの表示を作成する場合は、次のようにします。
@Html.EditorFor(m=> m.MyModelsProperty);
@Html.DisplayFor(m=> m.MyModlesProperty);
なぜデリゲートを渡さなければならないのですか? モデルのプロパティを直接渡せないのはなぜですか? 例えば:
@html.EditorFor(Model.MyModlesProperty);
MVC では、プロパティのエディターまたはプロパティの表示を作成する場合は、次のようにします。
@Html.EditorFor(m=> m.MyModelsProperty);
@Html.DisplayFor(m=> m.MyModlesProperty);
なぜデリゲートを渡さなければならないのですか? モデルのプロパティを直接渡せないのはなぜですか? 例えば:
@html.EditorFor(Model.MyModlesProperty);
この理由は、メタデータによるものです。、、、など[Required]
、モデルに設定できるすべての属性は、ラムダ式から抽出されます。値を渡しただけでは、ヘルパーはそこからメタデータを抽出できませんでした。ただのダミー値です。[DisplayName]
[DisplayFormat]
ラムダ式を使用すると、モデルのプロパティを分析し、そこからメタデータを読み取ることができます。その後、ヘルパーはインテリジェントになり、指定したプロパティに基づいて異なる動作をします。
したがって、ラムダ式を使用することで、ヘルパーは値を表示するだけでなく、さらに多くのことを行うことができます。この値をフォーマットしたり、この値を検証したりできます...
追加したいのは、Metadata と Html ヘルパーを Model 型に強く型付けすること以外に、別の理由があることです。
式を使用すると、文字列をプロジェクトにハードコーディングしなくても、プロパティの名前を知ることができます。MVC によって生成された HTML を確認すると、入力フィールドの名前が であることがわかります。"ModelType_PropertyName"
これにより、次のModel Binder
ようなコントローラー アクションに渡される複雑な型を作成できます。
public ActionResult Foo(MyModel model) { ... }
別の理由はLinq to SQL
. 式ツリーは、Lambda を SQL クエリに変換するために必要な魔法です。したがって、次のようなことをするとします。
Html.DisplayFor(p => p.Addresses.Where(j => j.Country == "USA"))
DbContext がまだ開いている場合は、クエリが実行されます。
UPDATE
間違いを打ちました。あなたは毎日何か新しいことを学びます。
最初の例は、厳密に型指定されたパラメーターを提供します。モデルからプロパティを選択する必要があります。2 番目がよりLoosely-typedである場合、モデルの有効なプロパティではないものであっても、何でも入れることができます。
編集: 驚いたことに、強いタイピングと緩いタイピングの良い例/定義を見つけることができなかったので、これに関する短い例を挙げます。
署名があった場合@html.EditorFor(string propertyName);
、名前を入力するときにタイプミスをする可能性があり、実行時まで検出されません。さらに悪いことに、モデルのプロパティが変更された場合、コンパイラ エラーはスローされず、実行時まで検出されません。問題のデバッグに多くの時間を浪費する可能性があります。
一方、ラムダでは、モデルのプロパティが変更された場合、コンパイラ エラーが発生し、プログラムをコンパイルする場合は修正する必要があります。コンパイル時チェックは常に実行時チェックより優先されます。これにより、人的エラーや見落としの可能性がなくなります。