Come eseguo l'output html grezzo quando si utilizza RazorEngine (NON da MVC)


105

Sto cercando di generare email con contenuto HTML. questo contenuto è già passato attraverso i servizi igienico-sanitari, quindi non sono preoccupato al riguardo, tuttavia quando chiamo:

Razor.Parse(template, model);

sul seguente modello Razor:

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

l'e-mail che viene emessa è codificata HTMl, ma ho bisogno che sia decodificata. Come posso farlo?


Ho risposto a questa domanda, ma è stata eliminata come risposta duplicata perché ho risposto qui: stackoverflow.com/questions/23603593/… ... questa risposta funziona sia per MVC che per RazorEngine.
Brian Rice

Risposte:


181

RazorEngine, come il motore di visualizzazione Razor di MVC, codificherà automaticamente i valori scritti nel modello. Per aggirare questo problema, abbiamo introdotto un'interfaccia chiamata IEncodedString, con le implementazioni predefinite HtmlEncodedStringe RawString.

Per utilizzare quest'ultimo, è sufficiente effettuare una chiamata al Rawmetodo integrato di TemplateBase:

@Raw(Model.EmailContent)

4
@Matthew Ci scusiamo per il revival, ma anche se viene compilato, non sembra carino nell'editor HTML VS, non riconoscerà più Model o Raw. Eventuali soluzioni alternative?
Jeff

5
@ Jeff Penso che l'approccio giusto sia che RazorEngine esponga una classe statica Html.cs che ha un metodo statico .Raw in modo che elabori le chiamate standard a Html.Raw che possono essere utilizzate per ottenere l'evidenziazione della sintassi corretta in VS Razor editore.
Tod Thomson

8
@Manfred @Raw () funziona bene in RazorEngine (non ASP.NET MVC's Razor;))
Jeff

Vorrei vedere risolto anche questo. Ciò fa sì che l'intero progetto non venga compilato con MvcBuildViews abilitato ...
guidupuy

2
"HtmlEncodedString" non funziona! Usa invece: RawString. Guarda un esempio che funziona! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {return new RazorEngine.Text.RawString ("<div> Ciao! </div>");}
Charles


3

Se si dispone di una classe base personalizzata per i modelli, è possibile codificare il Writemetodo in modo che si comporti in modo simile al normale modello MVC: se il valore di output è, IHtmlStringnon dovrebbe codificarlo.

Ecco il codice che sto usando nella mia TemplateBaseclasse:

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

Sto usando RazorEngine 3.8.2 e @Raw(Model.Content)funziona perfettamente per me.



-1

Ho scoperto che tutto questo ha funzionato con me.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

4
Stai usando la libreria MVC che non è disponibile dal motore Razor, quindi questa non è una risposta alla domanda.
oligofren
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.