Gravação / saída de strings HTML sem escape


436

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 &amp;.


76
Para salvar as pessoas a longa história de discussão abaixo -@Html.Raw()
Chris S

Para salvar pessoas como eu tentando fazer isso com tipos anônimos em visualizações dinamicamente digitadas, onde isso não funcionará - veja esta resposta para minha pergunta mais específica. Embora o uso dessa abordagem com uma visualização fortemente tipada seja ainda melhor, se sua situação permitir.
brichins

Respostas:


653

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 HtmlStringou qualquer outro tipo que seja implementado IHtmlStringno modelo ou diretamente embutido e use regularmente @:

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

Obrigado por esta resposta. Me ajudou a terminar uma pequena tarefa que estava aprendendo. :) No entanto, eu estou usando a versão mais recente do MVC3 e até agora não Html.Raw :(

1
Oi Sergio. Estou usando o MVC 3 e o método Raw corretamente.
Gui

1
Obrigado pela resposta! Eu ainda estou aprendendo MVC 3 e isso estava me iludindo.
Todd Richardson

3
@ Lorenzo, +1 Estou usando o MVC 3 mais recente com razorsintaxe e Html.Rawdefinitivamente está disponível para mim.
Chris Snowden

1
Lorenzo, atualizei a resposta para remover a menção do MVC Beta como era há alguns anos atrás. Sinta-se livre para reverter / alterar.
Alexei Levenkov

75

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)

13
Eu prefiro esse método porque o HTML.Raw explode se a sequência passada for nula.
37Stars

1
Obrigado, isso é muito limpo!
Hajjat ​​12/10/2015

64

Você pode usar

@{ WriteLiteral("html string"); }

5
Isto foi incrível para mim, estava usando Navalha dentro de um aplicativo Hangfire para enviar e-mails ... Html.Raw()não funciona lá
shanabus

1 for WriteLiteral
muhammed basil

11

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

4

Você pode colocar sua string em viewdata no controller assim:

 ViewData["string"] = DBstring;

E, em seguida, chame esses dados de visualização da seguinte maneira:

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


0

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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.