したがって、タイトルがすべてを物語っているはずです。
ASP.NET MVC で再利用可能なコンポーネントを作成するには、3 つのオプションがあります (他に言及していないオプションもある可能性があります)。
部分ビュー:
@Html.Partial(Model.Foo, "SomePartial")
カスタムエディターテンプレート:
@Html.EditorFor(model => model.Foo)
カスタム表示テンプレート:
@Html.DisplayFor(model => model.Foo)
実際の View/HTML に関しては、3 つの実装はすべて同一です。
@model WebApplications.Models.FooObject
<!-- Bunch of HTML -->
そこで質問なのですが、3 つのうちどれを使用するかをいつ、どのように決めるのでしょうか?
私が本当に探しているのは、テンプレートを作成する前に自分自身に尋ねる質問のリストです。その答えを使用して、どのテンプレートを使用するかを決めることができます。
EditorFor/DisplayFor で優れている点は次の 2 つです。
HTML ヘルパーをレンダリングするときにモデル階層を尊重します (たとえば、「Foo」モデルに「Bar」オブジェクトがある場合、「Bar」の HTML 要素は「Foo.Bar.ElementName」でレンダリングされ、部分的には「ElementName」になります)。
List<T>
より堅牢な、たとえばViewModel に何かの がある場合、 を使用できます@Html.DisplayFor(model => model.CollectionOfFoo)
。MVC はそれがコレクションであることを認識し、各項目の単一の表示をレンダリングするほどスマートです (明示的な for ループを必要とする Partial とは対照的です)。
DisplayFor は「読み取り専用」テンプレートをレンダリングするとも聞きましたが、理解できません。そこにフォームを配置することはできないのでしょうか?
他の理由を教えていただけますか? 3 つを比較したリストや記事はどこかにありますか?
ベストアンサー1
EditorFor
vsDisplayFor
はシンプルです。メソッドのセマンティクスは、編集/挿入ビューと表示/読み取り専用ビューをそれぞれ生成することです。DisplayFor
データを表示するときに使用します (つまり、モデル値を含む div と span を生成するとき)。EditorFor
データを編集/挿入するときに使用します (つまり、フォーム内で入力タグを生成するとき)。
上記のメソッドはモデル中心です。つまり、モデル メタデータが考慮されます (たとえば、モデル クラスに[UIHintAttribute]
またはを注釈として追加する[DisplayAttribute]
と、モデルの UI を生成するためにどのテンプレートが選択されるかが影響を受けます)。また、通常はデータ モデル (データベースの行を表すモデルなど) にも使用されます。
一方、Partial
ビュー中心であるため、主に適切な部分ビューを選択することに関心があります。ビューが正しく機能するためにモデルが必ずしも必要というわけではありません。サイト全体で再利用される共通のマークアップ セットを持つだけで済みます。もちろん、この部分の動作に影響を与えたい場合がよくあります。その場合は、適切なビュー モデルを渡す必要があります。
については質問されていませんが、@Html.Action
これもここで言及する価値があります。これは、Partial
コントローラーの子アクションを実行してからビュー (通常は部分ビュー) をレンダリングするという点で、 のより強力なバージョンと考えることができます。子アクションは、部分ビューに属さない追加のビジネス ロジックを実行できるため、これは重要です。たとえば、ショッピング カート コンポーネントを表すことができます。これを使用する理由は、アプリケーション内のすべてのコントローラーでショッピング カート関連の作業を実行することを避けるためです。
最終的に、選択はアプリケーションで何をモデル化しているかによって異なります。また、組み合わせることができることも覚えておいてください。たとえば、ヘルパーを呼び出す部分的なビューを持つことができますEditorFor
。実際には、アプリケーションが何であるか、そして繰り返しを避けながらコードの再利用を最大限に促進するためにそれをどのようにファクタリングするかによって異なります。