1. ホーム
  2. asp.net-mvc

[解決済み】ASP.NET MVC 3 - 部分テンプレートと表示テンプレートと編集テンプレート

2022-04-15 09:52:39

質問

つまり、タイトルが物語っているはずです。

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点です。

  1. HTMLヘルパーをレンダリングする際に、モデル階層を尊重します(例えば、"Foo" モデル上に "Bar" オブジェクトがある場合、 "Bar" の HTML要素は "Foo.Bar.ElementName" で、一方、パーシャルは "ElementName" でレンダリングされます)。

  2. より堅牢になりました。 List<T> を使用すると、ViewModelの中の何かの @Html.DisplayFor(model => model.CollectionOfFoo) MVCは賢いので、コレクションであることを認識し、各アイテムの単一表示をレンダリングします(明示的なforループが必要なPartialとは対照的です)。

DisplayForはquot;read-only"テンプレートをレンダリングするとも聞いたことがありますが、よくわかりません - そこにフォームを投げることはできないのでしょうか?

誰か他の理由を教えてください。この3つを比較したリストや記事はどこかにありますか?

解決方法は?

EditorForDisplayFor はシンプルです。このメソッドのセマンティクスは、編集/挿入と表示/読み取り専用ビューを (それぞれ) 生成することです。使用方法 DisplayFor データを表示するとき(つまり、モデルの値を含むdivやspanを生成するとき)。使用方法 EditorFor データを編集・挿入する場合(フォーム内に入力タグを生成する場合など)。

上記のメソッドはモデルセントリックです。これは、モデルのメタデータを考慮することを意味します (例えば、モデルクラスに対して [UIHintAttribute] または [DisplayAttribute] で、これはモデルのUIを生成するためにどのテンプレートが選ばれるかに影響します。また、通常、データモデル(すなわち、データベースの行を表すモデルなど)にも使用されます。

一方 Partial はビュー中心で、正しい部分ビューを選択することにほとんど関心があります。ビューが正しく機能するためには、必ずしもモデルが必要なわけではありません。サイト全体で再利用される共通のマークアップを持つだけでよいのです。もちろん、しばしばこのパーシャルの動作に影響を与えたい場合があり、その場合は適切なビューモデルを渡すとよいでしょう。

についての質問はありませんでした。 @Html.Action これも言及に値する。のより強力なバージョンと考えることができます。 Partial コントローラの子アクションを実行した後に、ビュー (通常は部分ビュー) をレンダリングするという点で、このアクションは優れています。これは、子アクションが部分ビューに属さない追加のビジネスロジックを実行することができるという点で重要です。例えば、ショッピングカートのコンポーネントを表すことができます。これを使用する理由は、アプリケーション内のすべてのコントローラでショッピングカート関連の作業を実行するのを避けるためです。

最終的には、アプリケーションで何をモデル化するかによって選択することになります。また、混ぜて使うことができることも覚えておいてください。たとえば、部分ビューで EditorFor ヘルパーを使用します。アプリケーションの内容と、繰り返しを避けながらコードの再利用を最大限に促進するための要因に、本当に依存します。