Eu tenho HTML seguro / higienizado salvo em uma tabela de banco de dados.
Como posso escrever esse conteúdo HTML em uma exibição do Razor?
Ele sempre escapa caracteres como <
e comercial para &
.
Eu tenho HTML seguro / higienizado salvo em uma tabela de banco de dados.
Como posso escrever esse conteúdo HTML em uma exibição do Razor?
Ele sempre escapa caracteres como <
e comercial para &
.
Respostas:
Supondo que seu conteúdo esteja dentro de uma string chamada mystring
...
Você pode usar:
@Html.Raw(mystring)
Como alternativa, você pode converter sua string para HtmlString
ou qualquer outro tipo que seja implementado IHtmlString
no modelo ou diretamente embutido e use regularmente @
:
@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
razor
sintaxe e Html.Raw
definitivamente está disponível para mim.
No ASP.NET MVC 3, você deve fazer algo assim:
// 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)
Você pode usar
@{ WriteLiteral("html string"); }
Html.Raw()
não funciona lá
Às vezes, pode ser complicado usar html bruto. Principalmente por causa da vulnerabilidade XSS. Se isso é uma preocupação, mas você ainda deseja usar o html bruto, pode codificar as partes assustadoras.
@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")
Resulta em
(<b><script>console.log('insert')</script>Hello</b>)
Além de usar @MvcHtmlString.Create(ViewBag.Stuff)
como sugerido por Dommer, sugiro que você também use a biblioteca AntiXSS , conforme sugerido em http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp -net.aspx
Ele codifica quase toda a sequência de ataques XSS possível.
Exemplo completo para usar funções de modelo no RazorEngine (para geração de email, por exemplo):
@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()