Como faço para gerar html bruto ao usar RazorEngine (NÃO do MVC)

105

Estou tentando gerar e-mails com conteúdo HTML. esse conteúdo já passou por saneamento então não fico preocupado com isso, porém quando ligo:

Razor.Parse(template, model);

no seguinte modelo Razor:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <body>
        @(new System.Web.HtmlString(Model.EmailContent))
    </body>
</html>

o e-mail enviado é codificado em HTMl, mas preciso que ele seja decodificado. Como posso fazer isso?

KallDrexx
fonte
Eu respondi isso, mas ela foi excluída como uma resposta duplicada porque eu respondi aqui: stackoverflow.com/questions/23603593/… ... esta resposta funciona para MVC e RazorEngine.
Brian Rice,

Respostas:

181

O RazorEngine, como o Razor View Engine do MVC, codificará automaticamente os valores gravados no modelo. Para contornar isso, introduzimos uma interface chamada IEncodedString, com as implementações padrão sendo HtmlEncodedStringe RawString.

Para usar o último, basta fazer uma chamada para o Rawmétodo embutido de TemplateBase:

@Raw(Model.EmailContent)
Matthew Abbott
fonte
4
@Matthew Desculpe por reviver, mas mesmo que compile, não parece muito no Editor de HTML do VS, ele não reconhecerá mais o Model ou o Raw. Alguma solução alternativa?
Jeff
5
@Jeff, estou pensando que a abordagem certa é o RazorEngine expor uma classe estática Html.cs que tem um método estático .Raw para que ele processe chamadas padrão para Html.Raw que podem ser usadas para obter o realce de sintaxe correto no VS Razor editor.
Tod Thomson
8
@Manfred @Raw () funciona bem no RazorEngine (não no Razor da ASP.NET MVC;))
Jeff
Gostaria de ver isso resolvido também. Isso faz com que todo o projeto não seja compilado com MvcBuildViews habilitado ...
guidupuy
2
O "HtmlEncodedString" não funciona! Em vez disso, use: RawString. Veja um exemplo que funciona! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {return new RazorEngine.Text.RawString ("<div> Olá! </div>");}
Charles
15

Para sua informação, tenho um fork que inclui a sintaxe @ Html.Raw (...) aqui:

https://github.com/Antaris/RazorEngine/pull/105

Tod Thomson
fonte
3
@ Html.Raw () não requer configuração inicial. Boa solução.
MartinJH
Eu também. Consegui gerar tags e valores HTML no Razor Code e passá-los para View with ViewData e exibir usando @ Html.Ras (ViewData ["NextEvent"]
JustJohn
3

Se você tiver uma classe base personalizada para seus modelos, você pode codificar o Writemétodo para se comportar de forma semelhante ao modelo MVC normal: se o valor de saída for, IHtmlStringele não deve codificá-lo.

Este é o código que estou usando em minha TemplateBaseaula:

// Writes the results of expressions like: "@foo.Bar"
public virtual void Write(object value)
{
    if (value is IHtmlString)
        WriteLiteral(value);
    else
        WriteLiteral(AntiXssEncoder.HtmlEncode(value.ToString(), false));
}

// Writes literals like markup: "<p>Foo</p>"
public virtual void WriteLiteral(object value)
{
    Buffer.Append(value);
}
Iravanchi
fonte
3

Estou usando o RazorEngine 3.8.2 e @Raw(Model.Content)está funcionando perfeitamente bem para mim.

curios.netter
fonte
-1

Eu descobri que tudo isso funcionou comigo.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)
MuniR
fonte
4
Você está usando a biblioteca MVC que não está disponível no mecanismo de barbear, portanto, esta não é uma resposta à sua pergunta.
oligofren