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

AGS
fonte
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
Lorenzo
fonte
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)
Tom Chantler
fonte
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"); }
Andrus
fonte
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>)
Travis J
fonte
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())
Ajay
fonte
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>
ZlobnyiSerg
fonte