[解決済み】ASP.NET MVC 3 - 部分テンプレートと表示テンプレートと編集テンプレート
質問
つまり、タイトルが物語っているはずです。
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はquot;read-only"テンプレートをレンダリングするとも聞いたことがありますが、よくわかりません - そこにフォームを投げることはできないのでしょうか?
誰か他の理由を教えてください。この3つを比較したリストや記事はどこかにありますか?
解決方法は?
EditorFor
対
DisplayFor
はシンプルです。このメソッドのセマンティクスは、編集/挿入と表示/読み取り専用ビューを (それぞれ) 生成することです。使用方法
DisplayFor
データを表示するとき(つまり、モデルの値を含むdivやspanを生成するとき)。使用方法
EditorFor
データを編集・挿入する場合(フォーム内に入力タグを生成する場合など)。
上記のメソッドはモデルセントリックです。これは、モデルのメタデータを考慮することを意味します (例えば、モデルクラスに対して
[UIHintAttribute]
または
[DisplayAttribute]
で、これはモデルのUIを生成するためにどのテンプレートが選ばれるかに影響します。また、通常、データモデル(すなわち、データベースの行を表すモデルなど)にも使用されます。
一方
Partial
はビュー中心で、正しい部分ビューを選択することにほとんど関心があります。ビューが正しく機能するためには、必ずしもモデルが必要なわけではありません。サイト全体で再利用される共通のマークアップを持つだけでよいのです。もちろん、しばしばこのパーシャルの動作に影響を与えたい場合があり、その場合は適切なビューモデルを渡すとよいでしょう。
についての質問はありませんでした。
@Html.Action
これも言及に値する。のより強力なバージョンと考えることができます。
Partial
コントローラの子アクションを実行した後に、ビュー (通常は部分ビュー) をレンダリングするという点で、このアクションは優れています。これは、子アクションが部分ビューに属さない追加のビジネスロジックを実行することができるという点で重要です。例えば、ショッピングカートのコンポーネントを表すことができます。これを使用する理由は、アプリケーション内のすべてのコントローラでショッピングカート関連の作業を実行するのを避けるためです。
最終的には、アプリケーションで何をモデル化するかによって選択することになります。また、混ぜて使うことができることも覚えておいてください。たとえば、部分ビューで
EditorFor
ヘルパーを使用します。アプリケーションの内容と、繰り返しを避けながらコードの再利用を最大限に促進するための要因に、本当に依存します。
関連
-
[解決済み] Razor View throwing "The name 'model' does not exist in the current context".
-
[解決済み] MVC 3 - 辞書に渡されたモデル項目の型は 'System.Collections.Generic.List`1 です。
-
[解決済み] ファイルアップロード ASP.NET MVC 3.0
-
[解決済み] ASP.NET MVCでビューをコンパイルする
-
[解決済み] 修正方法: ハンドラ "PageHandlerFactory-Integrated" のモジュールリストに "ManagedPipelineHandler" という不正なモジュールが含まれています。
-
[解決済み】部分ビューから特定のセクションにコンテンツを注入する ASP.NET MVC 3 with Razor View Engine
-
[解決済み】1つのビューに複数のモデルを表示する
-
[解決済み】リポジトリとサービスレイヤーの違い?
-
[解決済み] セキュリティ透過的なメソッド 'WebMatrix.WebData.PreApplicationStartCode.Start()' による試行。
-
[解決済み] ASP.Net MVC Html.HiddenForに間違った値が設定された場合
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] データベースに 'AspNetRoles' という名前のオブジェクトがすでに存在します。
-
[解決済み] JsonResultが特殊文字(apostrophe)を \u0027 としてパースしています。
-
[解決済み] ファイルまたはアセンブリ 'System.Web.Mvc' を読み込めませんでした。
-
[解決済み] DI向けNinjectとUnityの比較【終了しました
-
[解決済み] ASP.NET MVCのビューを文字列としてレンダリングする方法は?
-
[解決済み】MVC 4 Razor ファイルアップロード
-
[解決済み】ASP.NET MVC 3 コントローラから200 HTTPステータスコードを返す方法
-
[解決済み】リポジトリとサービスレイヤーの違い?
-
[解決済み] MVCとRazorにおけるHtml.TextboxForとHtml.EditorForの相違点
-
[解決済み] アクションリンクでエリア名を指定するには?