2017-06-29 97 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>"; 
    } 
} 

我不是特別驕傲關於黑客,但作爲他們說「如果它有效就不愚蠢」。如果有人有更好的主意,請分享...