Как выводить 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)

Ответ 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)