0

プロパティTypeを定義するときに Display Template 名を指定することはできますか?

たとえば、いくつかのクラスがあります。

public interface IFoo {}
public class Foo : IFoo {}
public class Bar : IFoo {}

それから私はモデルを持っています:

public class MyModel{
    IFoo IFooExample {get;set;}
}

次に、ビューでレンダリングしたいIFooExample:

@model MyModel

@Html.DisplayFor(x => x.IFooExample)

Foo同じ表示テンプレートをBar共有できます~/Views/Shared/DisplayTemplates/IFoo.cshtmlFoo.cshtmlこのロジックをMvc にプラグインして、Bar.cshtmlビューDisplayFor(@Html.DisplayFor(x => x.IFooExample, "IFoo.cshtml")

また、モデルを UIHint 属性で装飾したくありません。と の定義に関する情報を指定したいと思いFooますBar

[UIHint("IFoo.cshtml")]
public class Foo : IFoo{}

[UIHint("IFoo.cshtml")]
public class Bar : IFoo{}

ただし、UIHintsはクラス レベルでは適用できません。これを行う別の方法はありますか?

4

1 に答える 1

1

DisplayForインターフェイスに固有の新しい HtmlHelper 拡張メソッドを作成しIFoo、その中に必要なテンプレートを表示するだけです。例えば:

public static class DisplayForExtensions
{
    public static MvcHtmlString DisplayFor<TModel>(this HtmlHelper<TModel> html,
        Expression<Func<TModel, IFoo>> propertySelector)
    {
        return html.DisplayFor(propertySelector, "IFoo.cshtml");
    }
}

この拡張メソッドは、特にプロパティではなく、あらゆる種類の値を受け入れる元のメソッドよりも具体的IFooです。

この拡張メソッドは、剃刀テンプレートに表示される必要があることに注意してください。これを行うには、次のことができます。

  • @using目的の Razor テンプレートごとに名前空間を含める
  • に含めweb.config、新しい<add namespace="Your extension class namespace" />下を作成して<namespaces>、すべての剃刀テンプレートで使用できるようにします
于 2014-12-17T17:21:11.650 に答える