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

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

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

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

6 ответов

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

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

@Html.Raw(mystring)

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

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

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

@{ WriteLiteral("html string"); }

В 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>&lt;script&gt;console.log('insert')&lt;/script&gt;Hello</b>)

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

 ViewData["string"] = DBstring;

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

@Html.Raw(ViewData["string"].ToString())

Помимо использования @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>
Другие вопросы по тегам