Comment puis-je générer du HTML brut lors de l'utilisation de RazorEngine (PAS de MVC)

105

J'essaie de générer des e-mails avec du contenu HTML. ce contenu est déjà passé par l'assainissement, donc je ne suis pas inquiet à cet égard, cependant quand j'appelle:

Razor.Parse(template, model);

sur le modèle Razor suivant:

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

l'e-mail qui est produit est codé HTMl, mais j'en ai besoin décodé. Comment puis-je accomplir cela?

KallDrexx
la source
J'ai répondu à cela, mais elle a été supprimée en tant que réponse en double parce que je lui ai répondu ici: stackoverflow.com/questions/23603593/… ... cette réponse fonctionne à la fois pour MVC et RazorEngine.
Brian Rice

Réponses:

181

RazorEngine, comme Razor View Engine de MVC, encodera automatiquement les valeurs écrites dans le modèle. Pour contourner ce problème, nous avons introduit une interface appelée IEncodedString, les implémentations par défaut étant HtmlEncodedStringet RawString.

Pour utiliser ce dernier, il suffit d'appeler la Rawméthode intégrée deTemplateBase :

@Raw(Model.EmailContent)
Matthew Abbott
la source
4
@Matthew Désolé pour la relance, mais même si cela compile, il n'a pas l'air joli dans l'éditeur VS HTML, il ne reconnaîtra plus le modèle ou le brut. Des solutions de contournement?
Jeff le
5
@Jeff Je pense que la bonne approche est pour RazorEngine d'exposer une classe statique Html.cs qui a une méthode statique .Raw afin qu'il traite les appels standard à Html.Raw qui peuvent être utilisés pour obtenir une coloration syntaxique correcte dans VS Razor éditeur.
Tod Thomson
8
@Manfred @Raw () fonctionne très bien dans RazorEngine (pas le rasoir d'ASP.NET MVC;))
Jeff
J'aimerais voir cela résolu aussi. Cela empêche l'ensemble du projet de se construire avec MvcBuildViews activé ...
guidupuy
2
Le "HtmlEncodedString" ne fonctionne pas! Utilisez plutôt: RawString. Voir un exemple qui fonctionne! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {return new RazorEngine.Text.RawString ("<div> Hi there! </div>");}
Charles
15

Pour info, j'ai un fork qui inclut la syntaxe @ Html.Raw (...) ici:

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

Tod Thomson
la source
3
@ Html.Raw () ne nécessite aucune configuration initiale. Bonne solution.
MartinJH
Moi aussi. J'ai pu générer des balises HTML et des valeurs dans Razor Code et les transmettre à View with ViewData et les afficher à l'aide de @ Html.Ras (ViewData ["NextEvent"]
JustJohn
3

Si vous avez une classe de base personnalisée pour vos modèles, vous pouvez coder la Writeméthode pour qu'elle se comporte comme un modèle MVC normal: si la valeur de sortie est, IHtmlStringelle ne doit pas l'encoder.

Voici le code que j'utilise dans ma 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);
}
Iravanchi
la source
3

J'utilise RazorEngine 3.8.2 et @Raw(Model.Content)fonctionne parfaitement pour moi.

curieux.netter
la source
-1

J'ai trouvé que tout cela fonctionnait avec moi.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)
MuniR
la source
4
Vous utilisez la bibliothèque MVC qui n'est pas disponible à partir du moteur de rasoir, ce n'est donc pas une réponse à la question.
oligofren