Як вивести сирий 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, але мені потрібно його розшифрувати. Як я можу це досягти?


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

Відповіді:


181

RazorEngine, як і MVC's Razor View Engine, автоматично кодує значення, записані в шаблон. Щоб вирішити це питання, ми ввели інтерфейс, який називається IEncodedString, з типовими реалізаціями HtmlEncodedStringта RawString.

Щоб скористатися останнім, просто зателефонуйте до вбудованого Rawметоду TemplateBase:

@Raw(Model.EmailContent)

4
@Matthew Вибачте за відродження, але, незважаючи на те, що це компілюється, він не дуже виглядає в редакторі VS HTML, він більше не зможе розпізнати Model або Raw. Будь-які обходи?
Джефф

5
@Jeff Я думаю, що правильний підхід полягає в тому, щоб RazorEngine розкрив статичний клас Html.cs, який має статичний метод. редактор.
Тод Томсон

8
@Manfred @Raw () прекрасно працює в RazorEngine (не бритва ASP.NET MVC;))
Jeff

Хочеться, щоб і це вирішилося. Це призводить до того, що весь проект не створюється з увімкненою програмою MvcBuildViews ...
guideupuy

2
"HtmlEncodedString" не працює! Замість цього використовуйте: RawString. Дивіться приклад, який працює! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {повернути новий RazorEngine.Text.RawString ("<div> Привіт там! </div>");}
Чарльз

15

FYI У мене вилка, яка включає синтаксис @ Html.Raw (...) тут:

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


3
@ Html.Raw () не потрібно конфігурації наперед. Гарне рішення.
MartinJH

Я також. Мені вдалося створити HTML-теги та значення в коді Razor та передати його 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);
}



-1

Я виявив, що все це працювало зі мною.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

4
Ви користуєтеся бібліотекою MVC, яка недоступна в двигуні бритви, тому це не є відповіддю на питання.
олігофрен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.