Запись / вывод строк HTML без экранирования

436

У меня есть безопасный / санированный HTML, сохраненный в таблице БД.

Как я могу записать этот HTML-контент в виде Razor?

Он всегда избегает таких символов, как <и амперсанды &amp;.

AGS
источник
76
Чтобы спасти людей долгую историю обсуждения ниже -@Html.Raw()
Крис S
Чтобы спасти таких людей, как я, пытающихся сделать это с анонимными типами в динамически типизированных представлениях, где это не сработает - посмотрите этот ответ на мой более конкретный вопрос. Хотя использование этого подхода со строго типизированным представлением все же лучше, если позволяет ваша ситуация.
Brichins

Ответы:

653

Предположим, что ваш контент находится внутри строки с именем mystring...

Ты можешь использовать:

@Html.Raw(mystring)

В качестве альтернативы вы можете преобразовать вашу строку в HtmlStringлюбой другой тип, который реализуется IHtmlStringв модели или непосредственно в строку, и использовать обычный @:

@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
Lorenzo
источник
Спасибо за этот ответ. Помог мне выполнить небольшое задание, которое я изучал. :) Однако я использую последнюю версию MVC3 и до сих пор нет Html.Raw :(
1
Привет, Серхио. Я использую MVC 3, и я использую метод Raw правильно.
Gui
1
Спасибо за ответ! Я все еще изучаю MVC 3, и это ускользает от меня.
Тодд Ричардсон
3
@Lorenzo, +1 Я использую последнюю версию MVC 3 с razorсинтаксисом и Html.Rawопределенно доступна для меня.
Крис Сноуден
1
Лоренцо, я обновил ответ, чтобы убрать упоминание о бета-версии MVC, как это было несколько лет назад. Не стесняйтесь вернуться / изменить.
Алексей Левенков
75

В ASP.NET MVC 3 вы должны сделать что-то вроде этого:

// Say you have a bit of HTML like this in your controller:
ViewBag.Stuff = "<li>Menu</li>"
//  Then you can do this in your view:
@MvcHtmlString.Create(ViewBag.Stuff)
Том Чантлер
источник
13
Я предпочитаю этот метод, потому что HTML.Raw взрывается, если переданная строка пуста.
37
1
Спасибо, это очень чисто!
Хаджат
64

Ты можешь использовать

@{ WriteLiteral("html string"); }
Андрус
источник
5
Это было потрясающе для меня, я использовал Razor в приложении Hangfire для отправки электронных писем ... Html.Raw()там не работает
shanabus
1 для WriteLiteral
базилик
11

Иногда бывает сложно использовать сырой HTML. Главным образом из-за уязвимости XSS. Если это проблема, но вы все еще хотите использовать сырой HTML, вы можете кодировать страшные части.

@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")

Результаты в

(<b>&lt;script&gt;console.log('insert')&lt;/script&gt;Hello</b>)
Трэвис Дж
источник
4

Вы можете поместить вашу строку в viewdata в контроллере следующим образом:

 ViewData["string"] = DBstring;

А затем вызовите эти viewdata в виде, как это:

@Html.Raw(ViewData["string"].ToString())
Аджай
источник
2

Помимо использования @MvcHtmlString.Create(ViewBag.Stuff) в соответствии с предложением Dommer, я предлагаю вам также использовать библиотеку AntiXSS в качестве рекомендуемого файла http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp -net.aspx

Он кодирует почти все возможные строки атаки XSS.

Zeno
источник
0

Полный пример использования шаблонных функций в RazorEngine (например, для генерации электронной почты):

@model SomeModel
@{
    Func<PropertyChangeInfo, object> PropInfo =
        @<tr class="property">
            <td>
                @item.PropertyName                
            </td>
            <td class="value">
                <small class="old">@item.OldValue</small>
                <small class="new">@item.CurrentValue</small>                
            </td>
        </tr>;
}

<body>

@{ WriteLiteral(PropInfo(new PropertyChangeInfo("p1", @Model.Id, 2)).ToString()); }

</body>
ZlobnyiSerg
источник