Определите шаблон отображения для пользовательского типа

Можно ли указать имя шаблона отображения при определении типа свойства?

Например, у меня есть несколько классов:

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.cshtml, Как я могу подключить эту логику в Mvc, чтобы мне не нужно а) создать Foo.cshtml а также 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{}

Но UIHint не могут быть применены на уровне класса. Так есть ли другой способ сделать это?

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>, так что это доступно для всех шаблонов бритвы
Другие вопросы по тегам