InlineImage など、ビュー モデルに特定の構造化型を提供するクラス ライブラリを構築しています。
@Html.DisplayFor(...) で使用する場合、基本的にそのようなインスタンスのデフォルトの HTML 出力を定義できる必要があります...
- /Views/DisplayTemplates/InlineImage.cshtml が利用可能な場合は、そのテンプレートを使用します
- 利用できない場合は、デフォルトを出力する必要があります
でも ...
- そのクラスの ToString() だけをオーバーライドすると、正しい出力が得られますが、HTML エンコードされます。
[DisplayFormat(HtmlEncode = false)] を CLASS に追加することでエンコーディングを無効にできる MVC ソース コードを分析したところ、
しかし...属性はクラスを対象としないため、クラスに追加する別の属性にラップしてハックします。厄介ですが、少なくとも機能します:)
私のコードは現在次のようになっています。
[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 データ注釈で最初のプロパティを使用する
- Html データ注釈で表示プロパティを使用する
- IHtmlString の実装
ただし、フレームワークは、この場合、クラス自体のメタデータのみをチェックし、そのプロパティについてはチェックしないようです。IHtmlString は完全に無視されます。
クラスライブラリから特定のクラスのデフォルトの表示テンプレートを提供する方法のヒントを探しています。これは、標準の表示テンプレートをビューフォルダーに配置するだけでオーバーライドできます。