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,这样我就不必从我的 View 调用中 a)创建Foo.cshtml和或 b)视图( )的重载。Bar.cshtmlDisplayFor@Html.DisplayFor(x => x.IFooExample, "IFoo.cshtml")

我也不想用 UIHint 属性来装饰我的模型。我真的很想指定有关Fooand定义的信息Bar

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

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

但是UIHints不能应用于类级别。那么还有其他方法可以做到这一点吗?

4

1 回答 1

1

您只需要创建一个DisplayFor特定于 interface 的新 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" />的 under <namespaces>,以便它可用于所有剃须刀模板
于 2014-12-17T17:21:11.650 回答