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?


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)

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


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

3

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



-1

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

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.