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


436

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

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

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


76
Чтобы спасти людей долгую историю обсуждения ниже -@Html.Raw()
Крис S

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

Ответы:


653

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

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

@Html.Raw(mystring)

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

@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString

Спасибо за этот ответ. Помог мне выполнить небольшое задание, которое я изучал. :) Однако я использую последнюю версию 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.


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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.