Вывод по умолчанию для DisplayTemplate класса
Мы создаем библиотеку классов, которая предоставляет определенные структурированные типы для модели представления, например InlineImage.
Мне нужно иметь возможность определять вывод HTML по умолчанию для такого экземпляра при использовании с @Html.DisplayFor(...), в основном...
- Когда /Views/DisplayTemplates/InlineImage.cshtml доступен, используйте этот шаблон
- Когда недоступно, должно выводиться значение по умолчанию
Тем не мение...
- Когда я переопределяю только ToString() этого класса, он дает мне правильный вывод, но он получает HTML-кодировку
Анализируя исходный код MVC, я обнаружил, что могу отключить кодировку, добавив [DisplayFormat(HtmlEncode = false)] в класс
НО... атрибут не предназначен для класса, поэтому я взламываю его, помещая в другой атрибут, который добавляю в класс. Это противно, но по крайней мере работает:)
Мой код в настоящее время выглядит так:
[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 полностью игнорируется.
Я ищу любые подсказки, как предоставить шаблон отображения по умолчанию для данного класса из библиотеки классов, который можно переопределить, просто поместив стандартный шаблон отображения в папку представлений.
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>";
}
}
Я не особенно горжусь взломами, но, как говорится, "не глупо, если это работает".
Если у кого есть идея получше, поделитесь...