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?


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)

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


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



-1

Ich fand, dass all dies bei mir funktioniert hat.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

4
Sie verwenden die MVC-Bibliothek, die nicht in der Razor Engine verfügbar ist. Dies ist also keine Antwort auf die Frage.
Oligofren
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.