为自定义类型定义DisplayTemplate

时间:2014-12-17 10:53:47

标签: c# asp.net-mvc asp.net-mvc-4 razor display-templates

在定义属性类型?

时是否可以指定显示模板名称

例如,我有一些课程:

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)

FooBar可以共享相同的显示模板,即~/Views/Shared/DisplayTemplates/IFoo.cshtml。如何将此逻辑插入Mvc,以便我不必a)从我的View Foo.cshtml中创建Bar.cshtmlDisplayFor或b)并重载视图( @Html.DisplayFor(x => x.IFooExample, "IFoo.cshtml"))。

我也不想用UIHint属性来装饰我的Model。我真的想指定有关FooBar的定义的信息:

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

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

但是UIHint s can't be applied at the class level。那还有另一种方法吗?

1 个答案:

答案 0 :(得分:1)

您只需创建一个特定于接口DisplayFor的新IFoo HtmlHelper扩展方法,并在其中显示所需的模板。例如:

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属性。

请记住,此扩展方法必须在您的剃刀模板中可见。为此,您可以:

  • 在每个所需的Razor模板中包含@using的命名空间
  • 将其包含在web.config中,在<add namespace="Your extension class namespace" />下创建新的<namespaces>,以便所有剃须刀模板都可以使用