Jak wyprowadzić surowy kod HTML podczas korzystania z RazorEngine (NIE z MVC)

105

Próbuję generować wiadomości e-mail z zawartością HTML. ta zawartość przeszła już przez higienę, więc nie martwię się o to, jednak kiedy dzwonię:

Razor.Parse(template, model);

w następującym szablonie Razor:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <body>
        @(new System.Web.HtmlString(Model.EmailContent))
    </body>
</html>

e-mail, który jest wysyłany, jest zakodowany w formacie HTMl, ale potrzebuję go zdekodować. Jak mogę to osiągnąć?

KallDrexx
źródło
Odpowiedziałem na to, ale został usunięty jako zduplikowana odpowiedź, ponieważ odpowiedziałem tutaj: stackoverflow.com/questions/23603593/ ... ta odpowiedź działa zarówno dla MVC, jak i RazorEngine.
Brian Rice

Odpowiedzi:

181

RazorEngine, podobnie jak silnik widoku Razor MVC, automatycznie zakoduje wartości zapisane w szablonie. Aby obejść ten problem, wprowadziliśmy interfejs o nazwie IEncodedString, z domyślnymi implementacjami HtmlEncodedStringi RawString.

Aby użyć tego ostatniego, po prostu wywołaj wbudowaną Rawmetodę TemplateBase:

@Raw(Model.EmailContent)
Matthew Abbott
źródło
4
@Matthew Przepraszam za przywrócenie, ale mimo że kompiluje się, nie wygląda ładnie w edytorze VS HTML, nie będzie już rozpoznawać Model ani Raw. Jakieś obejścia?
Jeff
5
@Jeff Myślę, że właściwym podejściem jest udostępnienie przez RazorEngine statycznej klasy Html.cs, która ma statyczną metodę .Raw, aby przetwarzała standardowe wywołania do Html.Raw, które można wykorzystać do uzyskania prawidłowego podświetlania składni w VS Razor redaktor.
Tod Thomson
8
@Manfred @Raw () działa dobrze w RazorEngine (nie Razor ASP.NET MVC;))
Jeff
Chciałbym, żeby to też zostało rozwiązane. To powoduje, że cały projekt nie jest kompilowany z włączonym MvcBuildViews ...
guidupuy
2
„HtmlEncodedString” nie działa! Zamiast tego użyj: RawString. Zobacz przykład, który działa! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {return new RazorEngine.Text.RawString ("<div> Cześć! </div>");}
Karol
15

FYI Mam widelec, który zawiera składnię @ Html.Raw (...) tutaj:

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

Tod Thomson
źródło
3
@ Html.Raw () nie wymagało wstępnej konfiguracji. Dobre rozwiązanie.
MartinJH
Ja też. Udało mi się wygenerować znaczniki HTML i wartości w Razor Code i przekazać je do View with ViewData i wyświetlić przy użyciu @ Html.Ras (ViewData ["NextEvent"]
JustJohn
3

Jeśli masz niestandardową klasę bazową dla swoich szablonów, możesz zakodować Writemetodę, aby zachowywała się podobnie do zwykłego szablonu MVC: jeśli wartość wyjściowa jest IHtmlStringtaka, nie należy jej kodować.

Oto kod, którego używam w mojej TemplateBaseklasie:

// 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);
}
Iravanchi
źródło
3

Używam RazorEngine 3.8.2 i @Raw(Model.Content)działa dla mnie doskonale.

curious.netter
źródło
-1

Okazało się, że wszystkie te elementy współpracowały ze mną.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)
MuniR
źródło
4
Używasz biblioteki MVC, która nie jest dostępna w silniku maszynki do golenia, więc nie jest to odpowiedź na pytanie.
oligofren