У меня есть безопасный / санированный HTML, сохраненный в таблице БД.
Как я могу записать этот HTML-контент в виде Razor?
Он всегда избегает таких символов, как <
и амперсанды &
.
У меня есть безопасный / санированный HTML, сохраненный в таблице БД.
Как я могу записать этот HTML-контент в виде Razor?
Он всегда избегает таких символов, как <
и амперсанды &
.
Ответы:
Предположим, что ваш контент находится внутри строки с именем mystring
...
Ты можешь использовать:
@Html.Raw(mystring)
В качестве альтернативы вы можете преобразовать вашу строку в HtmlString
любой другой тип, который реализуется IHtmlString
в модели или непосредственно в строку, и использовать обычный @
:
@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
razor
синтаксисом и Html.Raw
определенно доступна для меня.
В 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)
Иногда бывает сложно использовать сырой HTML. Главным образом из-за уязвимости XSS. Если это проблема, но вы все еще хотите использовать сырой HTML, вы можете кодировать страшные части.
@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")
Результаты в
(<b><script>console.log('insert')</script>Hello</b>)
Помимо использования @MvcHtmlString.Create(ViewBag.Stuff)
в соответствии с предложением Dommer, я предлагаю вам также использовать библиотеку AntiXSS в качестве рекомендуемого файла http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp -net.aspx
Он кодирует почти все возможные строки атаки XSS.
Полный пример использования шаблонных функций в 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>
@Html.Raw()