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?


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)

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


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);
}

3

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



-1

Eu descobri que tudo isso funcionou comigo.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

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