2014-12-17 2 views
0

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

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

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, так что мне не нужно: a) создавать Foo.cshtml и Bar.cshtml или b) из моего вызова View 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 ей can't be applied at the class level. Так есть ли другой способ сделать это?

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

1

Вам просто нужно создать новый метод расширения 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>, так что он доступен для всех шаблонов бритвенных
Смежные вопросы