1

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 は完全に無視されます。

クラスライブラリから特定のクラスのデフォルトの表示テンプレートを提供する方法のヒントを探しています。これは、標準の表示テンプレートをビューフォルダーに配置するだけでオーバーライドできます。

4

1 に答える 1