2

ご存知かもしれませんが、ASP.NET MVC は、ビュー内のモデル フィールドのカスタム ビュー オーバーライドをサポートしています。フォルダには などの特別なフォルダがあり、これらのViewsフォルダにはViews\Shared\EditorTemplatesViews\Shared\DisplayTemplatesようなファイルを含めることができます。これらのファイルは、フィールドを持つモデルでビューをViews\Shared\EditorTemplates\String.cshtml呼び出すときに使用されるデフォルト ビューをオーバーライドします。@Html.EditorForString

私がやりたいのは、この機能をカスタムの種類のテンプレートに使用することです。Views\Shared\GroupTemplatesegViews\Shared\GroupTemplates\String.cshtmlとを含むようなフォルダーが必要で、 exampleを呼び出すことができるメソッドViews\Shared\GroupTemplates\Object.cshtmlを作成したいと考えています。HtmlHelperHtml.GroupFor(foo => foo.Bar)String.cshtmlBarStringObject.cshtml


予想される動作の完全な例。これが含まれている場合Views\Shared\GroupTemplates\String.cshtml

@model String
This is the string template

...そしてViews\Shared\GroupTemplates\Object.cshtmlこれが含まれています:

@model Object
This is the object template

私は次のようなモデルを持っています:

class Foo
{
    public bool Bar { get; set; }
    public String Baz { get; set; }
}

そして、次のViews\Foo\Create.cshtmlようなビュー:

@model Foo
@Html.GroupFor(m => m.Bar)
@Html.GroupFor(m => m.Baz)

ビューをレンダリングするCreate.cshtmlと、結果は次のようになります。

This is the object template
This is the string template

どのGroupForように実装する必要がありますか?

4

1 に答える 1

1

そのようにビューの場所を簡単に指定できるということです

html.Partial("~/Views/Shared/GroupTemplates/YourViewName.cshtml");

または、カスタムビューエンジンを実装してデフォルトの動作をオーバーライドすることもできます。例については、このブログを参照してください。動的ビューの場所を使用したカスタムビューエンジン

ただし、モデルタイプに基づいてビュー名を決定するロジックも再利用する必要があります。そのため、文字列名のビューが存在しない場合は、オブジェクトビューが選択されます。これは、親クラスを通過することを意味します。

EditorForがどのように実装されているか見てきました。

public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
    return html.TemplateFor<TModel, TValue>(expression, null, null, DataBoundControlMode.Edit, null);
}

内部のTemplateForメソッドを使用しており、再利用することはできません。

したがって、私は2つのオプションしか見ることができません。

  1. モデルタイプ名とその親クラスを試して、正しい名前のビューファイルが存在するかどうかを確認することにより、カスタムロジックを実装します。また、適切なビューが見つかった場合は、ヘルパーで部分拡張子を使用してください。
  2. リフレクションを使用して内部メソッドを呼び出すようにしてください。しかし、このアプローチは、解決策というよりはハックのようなものです。

それが役に立てば幸い!

于 2013-01-02T14:58:41.850 に答える