2

MVC では、プロパティのエディターまたはプロパティの表示を作成する場合は、次のようにします。

@Html.EditorFor(m=> m.MyModelsProperty);
@Html.DisplayFor(m=> m.MyModlesProperty);

なぜデリゲートを渡さなければならないのですか? モデルのプロパティを直接渡せないのはなぜですか? 例えば:

@html.EditorFor(Model.MyModlesProperty);
4

3 に答える 3

2

この理由は、メタデータによるものです。、、、など[Required]、モデルに設定できるすべての属性は、ラムダ式から抽出されます。値を渡しただけでは、ヘルパーはそこからメタデータを抽出できませんでした。ただのダミー値です。[DisplayName][DisplayFormat]

ラムダ式を使用すると、モデルのプロパティを分析し、そこからメタデータを読み取ることができます。その後、ヘルパーはインテリジェントになり、指定したプロパティに基づいて異なる動作をします。

したがって、ラムダ式を使用することで、ヘルパーは値を表示するだけでなく、さらに多くのことを行うことができます。この値をフォーマットしたり、この値を検証したりできます...

于 2013-04-01T08:24:53.513 に答える
1

追加したいのは、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
間違いを打ちました。あなたは毎日何か新しいことを学びます。

于 2013-04-01T08:46:33.847 に答える
0

最初の例は、厳密に型指定されたパラメーターを提供します。モデルからプロパティを選択する必要があります。2 番目がよりLoosely-typedである場合、モデルの有効なプロパティではないものであっても、何でも入れることができます。

編集: 驚いたことに、強いタイピングと緩いタイピングの良い例/定義を見つけることができなかったので、これに関する短い例を挙げます。

署名があった場合@html.EditorFor(string propertyName);、名前を入力するときにタイプミスをする可能性があり、実行時まで検出されません。さらに悪いことに、モデルのプロパティが変更された場合、コンパイラ エラーはスローされず、実行時まで検出されません。問題のデバッグに多くの時間を浪費する可能性があります。

一方、ラムダでは、モデルのプロパティが変更された場合、コンパイラ エラーが発生し、プログラムをコンパイルする場合は修正する必要があります。コンパイル時チェックは常に実行時チェックより優先されます。これにより、人的エラーや見落としの可能性がなくなります。

于 2013-04-01T08:29:03.830 に答える