Всегда выводить необработанный HTML с помощью MVC3 и Razor

Ive получил класс со свойством, которое выглядит так:

[AllowHtml]
[DataType(DataType.MultilineText)]
public string Description { get; set; }

Ive уже включил атрибут [AllowHtml], чтобы позволить мне отправить HTML в это свойство через форму, которую Ive построил, но я хочу, чтобы вывести значение свойства как необработанный HTML без его экранирования.

Я знаю, что могу использовать Html.Raw(Model.Description), но то, что я ищу, - это способ сказать Html.DisplayFor(m => m.Description) всегда выводить необработанный HTML. Есть ли атрибут, который я могу использовать, чтобы украсить свойства в моем классе, которые я хочу вести себя так?

В основном его ленивый - я не хочу вспоминать, какие свойства могут содержать HTML, поэтому я не хочу думать об использовании Html.Raw(…), когда мне нужно сделать вышеприведенный идентификатор, а скорее моя модель знает, что он должен делать это и делать это автоматически. Ive попытался найти ответ, но либо Im не формулировал его правильно, либо не сделал этого: (

Спасибо,

Ответы

Ответ 1

Измените Description proerpty, чтобы вернуть HtmlString.

Бритва не выходит за пределы значений HtmlString.
(Фактически, все Html.Raw действительно создает HtmlString)

Ответ 2

Это на самом деле довольно просто (как только вы знаете, как...). Измените свой DataType на [DataType(DataType.Html)] и создайте частичный вид, поместите его в Views/Shared/DisplayTemplates/Html.cshtml, с помощью этого:

@model string
@Html.Raw(Model)

Конечно, вы также не можете изменить атрибут DataType и назовите представление MultilineText.cshtml вместо Html.cshtml.

Ответ 3

Просто для получения дополнительной информации здесь - ваша проблема в том, что @всегда будет HtmlEncode, если у вас нет возврата к IHtmlString, поэтому проблема связана с символом @. Это одно из преимуществ синтаксиса бритвы - это безопаснее для htmlencode, чем нет. Таким образом, здесь нет "быстрого" способа, так как корень вашей проблемы является символом @, который исключает HtmlEncoding, если он найдет IHtmlString. Итак - нет "быстрого" способа обойти это, если вы не используете старый <% синтаксис, который ИМХО сосет по сравнению с бритвой:)