Определите шаблон отображения для пользовательского типа
Можно ли указать имя шаблона отображения при определении типа свойства?
Например, у меня есть несколько классов:
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>
, так что это доступно для всех шаблонов бритвы