I am trying to generate emails with HTML content. this content has already gone through sanitation so I am not worried in that regard, however when I call:
Razor.Parse(template, model);
on the following Razor template:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body>
@(new System.Web.HtmlString(Model.EmailContent))
</body>
</html>
the email that is outputted is HTMl encoded, but I need it decoded. How can I accomplish this?
RazorEngine, like MVC's Razor View Engine, will automatically encode values written to the template. To get around this, we've introduce an interface called IEncodedString
, with the default implementations being HtmlEncodedString
and RawString
.
To use the latter, simply make a call to the inbuilt Raw
method of TemplateBase
:
@Raw(Model.EmailContent)
FYI I have a fork that includes the @Html.Raw(...) syntax here:
https://github.com/Antaris/RazorEngine/pull/105
I am using RazorEngine 3.8.2 and @Raw(Model.Content)
is working perfectly fine for me.
If you have a custom base class for your templates, you can code Write
method to behave similar to normal MVC template: if the output value is IHtmlString
it should not encode it.
Here's the code I'm using in my TemplateBase
class:
// 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);
}
Built a wrapper for RazorEngine that adds in support for @Html.Raw()
and @Html.Partial()
https://github.com/b9chris/RazorEngineComplete
I found all of these worked with me.
@{var myHtmlString = new HtmlString(res);}
@myHtmlString
@MvcHtmlString.Create(res)
@Html.Raw(res)