web-dev-qa-db-ja.com

デフォルト以外のフォルダーからのMVCテンプレート(EditorTemplates / DisplayTemplates)?

MVCをデフォルト以外のフォルダー(Views/Shared/EditorTemplates&Views/Shared/DisplayTemplates)にポイントできますか?それらをその下のサブフォルダ、または共有フォルダ外の他のフォルダに配置します。

たとえば、このフォルダーの下にエディターテンプレートがある場合:

〜\ Views\Order\ProductModel.cshtml

EditorForテンプレートにこの一時的な名前を使用するように伝えるにはどうすればよいですか?

私はそれを完全に修飾しようとしましたが、これはうまくいきません:

@Html.EditorFor(m => m.ProductModel, @"~\Views\Order\ProductModel.cshtml")

スラッシュとバックスラッシュを、.chstmlの有無にかかわらず、考えられるすべての組み合わせで使用してみました。これはサポートされていないと思い始めていますが、なぜサポートされないのか想像できません。

43
Jerad Rose

いいえ、できません。

たとえば、このフォルダーの下にエディターテンプレートがある場合

これは、もはやエディターテンプレートではありません。それは部分的です。異なるコントローラー間でエディターテンプレートを共有する場合は、それらを~/Views/Shared/EditorTemplatesフォルダー内に配置するだけです。

サブフォルダに関する限り、これを行うことができます:

@Html.EditorFor(x => x.Foo, "Order/ProductModel")

~/Views/CurrentController/EditorTemplates/Order/ProductModel.cshtmlまたは~/Views/Shared/EditorTemplates/Order/ProductModel.cshtmlエディターテンプレートをレンダリングします。

54
Darin Dimitrov

古い質問ですが...特定のコントローラーのディスプレイ/エディターテンプレートを追加する適切な方法は、DisplayTemplatesまたはEditorTemplatesサブフォルダーに追加することです。

あなたの例では、あなたがOrderControllerを持っていると仮定すると、次のようにモデルの表示テンプレートをサブフォルダーに置くだけです:

~\Views\Order\DisplayTemplates\ProductModel.cshtml

次に、通常はビューから表示テンプレートを呼び出します(例: `〜\ Views\Order\Index.cshtmlから):

@Html.DisplayFor(m => m.MyProductModelProperty)
4
Nenad

これを行う場合:

@Html.EditorFor(x => x.Foo, "Order/ProductModel")

fooをコレクションとして解析し、エディターテンプレートを各アイテムに適用しません。それはむしろあなたのエディタテンプレートが全体としてコレクションに適用されるべきであると仮定します。

エディターテンプレートを各アイテムに個別に適用する場合は、ビューフォルダーの下のEditorTemplatesフォルダーに配置し(優先順位が高いため)、デフォルトの構文を使用します。

@Html.EditorFor(x => x.Foo)

もちろん、エディターテンプレートの名前は、コレクション内のアイテムのタイプと一致する必要があります。

3
lukeguy