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ąć?


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)

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


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);
}



-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)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.