Wie gebe ich rohes HTML aus, wenn ich RazorEngine verwende (NICHT von MVC)?

105

Ich versuche, E-Mails mit HTML-Inhalten zu generieren. Dieser Inhalt wurde bereits saniert, daher mache ich mir diesbezüglich keine Sorgen, wenn ich jedoch anrufe:

Razor.Parse(template, model);

auf der folgenden Rasiermesser-Vorlage:

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

Die ausgegebene E-Mail ist HTMl-codiert, aber ich muss sie decodieren. Wie kann ich das erreichen?

KallDrexx
quelle
Ich habe darauf geantwortet, aber es wurde als doppelte Antwort gelöscht, da ich es hier beantwortet habe: stackoverflow.com/questions/23603593/… ... diese Antwort funktioniert sowohl für MVC als auch für RazorEngine.
Brian Rice

Antworten:

181

RazorEngine codiert wie die Razor View Engine von MVC automatisch Werte, die in die Vorlage geschrieben wurden. Um dies zu umgehen, haben wir eine Schnittstelle namens IEncodedStringmit den Standardimplementierungen HtmlEncodedStringund eingeführt RawString.

Um letzteres zu verwenden, rufen Sie einfach die eingebaute RawMethode auf TemplateBase:

@Raw(Model.EmailContent)
Matthew Abbott
quelle
4
@Matthew Entschuldigung für die Wiederbelebung, aber obwohl dies kompiliert wird, sieht es im VS HTML-Editor nicht besonders hübsch aus, erkennt Model oder Raw nicht mehr. Problemumgehungen?
Jeff
5
@ Jeff Ich denke, der richtige Ansatz ist, dass RazorEngine eine statische Klasse Html.cs mit einer statischen Methode .Raw verfügbar macht, damit Standardaufrufe an Html.Raw verarbeitet werden, mit denen die korrekte Syntaxhervorhebung in VS Razor erzielt werden kann Editor.
Tod Thomson
8
@Manfred @Raw () funktioniert gut in RazorEngine (nicht ASP.NET MVC's Razor;))
Jeff
Ich würde gerne sehen, dass dies auch gelöst wird. Dies führt dazu, dass das gesamte Projekt nicht mit aktivierten MvcBuildViews erstellt wird ...
guidupuy
2
Der "HtmlEncodedString" funktioniert nicht! Verwenden Sie stattdessen: RawString. Sehen Sie sich ein Beispiel an, das funktioniert! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {neues RazorEngine.Text.RawString zurückgeben ("<div> Hi there! </ div>");}
Charles
15

Zu Ihrer Information Ich habe hier eine Abzweigung, die die @ Html.Raw (...) -Syntax enthält:

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

Tod Thomson
quelle
3
@ Html.Raw () erforderte keine Vorabkonfiguration. Gute Lösung.
MartinJH
Ich auch. Ich konnte HTML-Tags und -Werte in Razor Code generieren und mit ViewData an View übergeben und mit @ Html.Ras (ViewData ["NextEvent"]
JustJohn
3

Wenn Sie eine benutzerdefinierte Basisklasse für Ihre Vorlagen haben, können Sie die WriteMethode so codieren , dass sie sich ähnlich wie eine normale MVC-Vorlage verhält: Wenn der Ausgabewert lautet IHtmlString, sollte sie nicht codiert werden.

Hier ist der Code, den ich in meiner TemplateBaseKlasse verwende:

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

Ich benutze RazorEngine 3.8.2 und @Raw(Model.Content)arbeite einwandfrei für mich.

neugierig.netter
quelle
-1

Ich fand, dass all dies bei mir funktioniert hat.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)
MuniR
quelle
4
Sie verwenden die MVC-Bibliothek, die nicht in der Razor Engine verfügbar ist. Dies ist also keine Antwort auf die Frage.
Oligofren