Как выводить необработанный html при использовании RazorEngine (НЕ из MVC)

105

Я пытаюсь создавать электронные письма с содержанием 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, но мне нужно его декодировать. Как я могу этого добиться?

KallDrexx
источник
Я ответил на это, но он был удален как повторяющийся ответ, потому что я ответил на него здесь: stackoverflow.com/questions/23603593/… ... этот ответ работает как для MVC, так и для RazorEngine.
Брайан Райс,

Ответы:

181

RazorEngine, как и MVC Razor View Engine, автоматически кодирует значения, записанные в шаблон. Чтобы обойти это, мы представили интерфейс IEncodedStringс именами по умолчанию HtmlEncodedStringи RawString.

Чтобы использовать последнее, просто вызовите встроенный Rawметод TemplateBase:

@Raw(Model.EmailContent)
Мэтью Эбботт
источник
4
@Matthew Извините за возрождение, но даже несмотря на то, что он компилируется, он не выглядит красиво в редакторе VS HTML, он больше не распознает Model или Raw. Есть обходные пути?
Джефф
5
@Jeff Я думаю, что правильным подходом для RazorEngine является предоставление статического класса Html.cs, который имеет статический метод .Raw, чтобы он обрабатывал стандартные вызовы Html.Raw, которые можно использовать для получения правильной подсветки синтаксиса в VS Razor редактор.
Тод Томсон
8
@Manfred @Raw () отлично работает в RazorEngine (не в Razor ASP.NET MVC;))
Джефф
Хотелось бы, чтобы и это было решено. Это приводит к тому, что весь проект не собирается с включенным MvcBuildViews ...
guidupuy
2
"HtmlEncodedString" не работает! Вместо этого используйте: RawString. Посмотрите пример, который работает! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {return new RazorEngine.Text.RawString ("<div> Привет! </div>");}
Чарльз
15

К вашему сведению, у меня есть вилка, которая включает здесь синтаксис @ Html.Raw (...):

https://github.com/Antaris/RazorEngine/pull/105

Тод Томсон
источник
3
@ Html.Raw () не требует предварительной настройки. Хорошее решение.
MartinJH
Я тоже. Мне удалось сгенерировать HTML-теги и значения в Razor Code и передать их в View с ViewData и отобразить с помощью @ Html.Ras (ViewData ["NextEvent"]
JustJohn
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);
}
Иреванчи
источник
3

Я использую RazorEngine 3.8.2, и @Raw(Model.Content)у меня все работает отлично.

любопытный.netter
источник
-1

Я обнаружил, что все это работает со мной.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)
MuniR
источник
4
Вы используете библиотеку MVC, которая недоступна в движке бритвы, поэтому это не ответ на вопрос.
oligofren