2017-06-29 94 views
1

我们正在构建一个类库,为视图模型提供某些结构化类型,例如, InlineImage。类DisplayTemplate的默认输出

我需要能够定义默认HTML输出,这样的实例与@ Html.DisplayFor(...),基本上使用时...

  • 当/Views/DisplayTemplates/InlineImage.cshtml是可用,然后使用该模板
  • 时不可用,它应该输出默认

但是......

  • 当我仅仅重载的ToString该类的(),它给了我正确的输出,但它可以让HTML编码

我发现了分析,我能够禁用编码MVC源代码中添加[DisplayFormat(的HTMLEncode = false)]给CLASS

但是...该属性并不是以类为目标的,所以我通过将它包装到我添加到类中的另一个属性来入侵它。这是讨厌的,但至少工作:)

我的代码目前看起来是这样的:

[AttributeUsage(AttributeTargets.Class)] 
class DisableHtmlEncodeAttribute : DisplayFormatAttribute 
{ 
    public DisableHtmlEncodeAttribute() 
    { 
     HtmlEncode = false; 
    } 
} 

[DisableHtmlEncode] 
internal class InlineImage : IInlineImage 
{ 
    public string AltText { get; set; } 

    public string Src { get; set; } 


    public override string ToString() 
    { 
     return $"<figure><img src=\"{Src}\" alt=\"{AltText}\"></figure>"; 
    } 
} 

它为默认的显示,但是当文件系统提供了显示模板,不使用它。可能是因为这些数据注释导致了某些事物的切割。

我已经尝试过其他几种方法与此类似:

  • 使用第一属性与HTML数据注解
  • 使用display属性与HTML数据注解
  • 实施IHtmlString

但该框架似乎只为类本身检查元数据,但不检查其在此情况下的属性。而IHtmlString完全被忽略。

我在寻找任何提示如何从类库中为给定的类提供默认的显示模板,只需将标准显示模板放置到视图文件夹即可重写。

回答

1

因此,事实证明,我比我想象的更近,并且最后一次试验使它工作。

诀窍与我对DisableHtmlEncode属性所做的相似,但具有UIHint属性。通过这种方式,您可以明显地告诉引擎将显示模板应用于类,并且它比Format属性更强。

下面是提供的默认HTML标记的能力,最终代码,当在FS提供了显示模板,它使用的模板:

[AttributeUsage(AttributeTargets.Class)] 
class DisableHtmlEncodeAttribute : DisplayFormatAttribute 
{ 
    public DisableHtmlEncodeAttribute() 
    { 
     HtmlEncode = false; 
    } 
} 

[AttributeUsage(AttributeTargets.Class)] 
class UseDisplayTemplateAttribute : UIHintAttribute 
{ 
    public UseDisplayTemplateAttribute(string uiHint) 
     : base(uiHint) 
    { 
    } 
} 

[DisableHtmlEncode] 
[UseDisplayTemplate("InlineImage")] 
internal class InlineImage : IInlineImage 
{ 
    public string AltText { get; set; } 

    public string Src { get; set; } 

    public override string ToString() 
    { 
     return $"<figure><img src=\"{Src}\" alt=\"{AltText}\"></figure>"; 
    } 
} 

我不是特别骄傲关于黑客,但作为他们说“如果它有效就不愚蠢”。如果有人有更好的主意,请分享...