J'essaie de générer des emails avec un contenu HTML. ce contenu a déjà été traité en assainissement, je ne suis donc pas inquiet à cet égard, mais lorsque 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>
le courrier électronique généré est codé en HTMl, mais il me faut le décoder. Comment puis-je accomplir cela?
RazorEngine, comme le moteur 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 HtmlEncodedString
et RawString
.
Pour utiliser ce dernier, appelez simplement la méthode Raw
intégrée de TemplateBase
:
@Raw(Model.EmailContent)
Pour info, j'ai un fork qui inclut la syntaxe @ Html.Raw (...) ici:
J'utilise RazorEngine 3.8.2 et @Raw(Model.Content)
fonctionne parfaitement pour moi.
Si vous avez une classe de base personnalisée pour vos modèles, vous pouvez coder la méthode Write
pour qu'elle se comporte comme un modèle MVC normal: si la valeur en sortie est IHtmlString
, elle ne devrait pas l'encoder.
Voici le code que j'utilise dans ma classe TemplateBase
:
// 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);
}
Construit un wrapper pour RazorEngine qui ajoute le support pour @Html.Raw()
et @Html.Partial()