Как выводить raw html при использовании RazorEngine (НЕ из MVC)
Я пытаюсь создать электронные письма с содержимым HTML. этот контент уже прошел санитарию, поэтому я не беспокоюсь по этому поводу, однако, когда я звоню:
Razor.Parse(template, model);
на следующем шаблоне Razor:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body>
@(new System.Web.HtmlString(Model.EmailContent))
</body>
</html>
выводимое письмо кодируется HTMl, но мне нужно его декодировать. Как я могу это сделать?
Ответы
Ответ 1
RazorEngine, подобно MVC Razor View Engine, автоматически кодирует значения, записанные в шаблон. Чтобы обойти это, мы представили интерфейс под названием IEncodedString
, при этом реализации по умолчанию были HtmlEncodedString
и RawString
.
Чтобы использовать последнее, просто сделайте вызов встроенного метода Raw
TemplateBase
:
@Raw(Model.EmailContent)
Ответ 2
FYI У меня есть вилка, которая включает синтаксис @Html.Raw(...) здесь:
https://github.com/Antaris/RazorEngine/pull/105
Ответ 3
Если у вас есть собственный базовый класс для ваших шаблонов, вы можете закодировать метод Write
, чтобы вести себя аналогично обычным шаблонам MVC: если выходное значение IHtmlString
, оно не должно кодировать его.
Здесь код, который я использую в классе 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);
}
Ответ 4
Я нашел, что все это сработало со мной.
@{var myHtmlString = new HtmlString(res);}
@myHtmlString
@MvcHtmlString.Create(res)
@Html.Raw(res)