¿Cómo puedo generar html sin procesar cuando uso RazorEngine (NO desde MVC)?

105

Estoy intentando generar correos electrónicos con contenido HTML. este contenido ya ha pasado por el saneamiento por lo que no me preocupa en ese sentido, sin embargo cuando llamo:

Razor.Parse(template, model);

en la siguiente plantilla de Razor:

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

el correo electrónico que se envía está codificado en HTMl, pero lo necesito decodificado. ¿Cómo puedo lograr esto?

KallDrexx
fuente
Respondí esto, pero se eliminó como una respuesta duplicada porque la respondí aquí: stackoverflow.com/questions/23603593/… ... esta respuesta funciona tanto para MVC como para RazorEngine.
Brian Rice

Respuestas:

181

RazorEngine, como Razor View Engine de MVC, codificará automáticamente los valores escritos en la plantilla. Para solucionar esto, hemos introducido una interfaz llamada IEncodedString, con las implementaciones predeterminadas HtmlEncodedStringy RawString.

Para usar este último, simplemente haga una llamada al Rawmétodo incorporado de TemplateBase:

@Raw(Model.EmailContent)
Matthew Abbott
fuente
4
@Matthew Lo siento por revivir, pero aunque esto se compila, no se ve bonito en el Editor de HTML VS, ya no reconocerá Model o Raw. ¿Alguna solución?
Jeff
5
@Jeff Estoy pensando que el enfoque correcto es que RazorEngine exponga una clase estática Html.cs que tiene un método estático .Raw para que procese llamadas estándar a Html.Raw que se pueden usar para obtener el resaltado de sintaxis correcto en VS Razor editor.
Tod Thomson
8
@Manfred @Raw () funciona bien en RazorEngine (no Razor de ASP.NET MVC;))
Jeff
Me gustaría ver esto resuelto también. Esto hace que todo el proyecto no se compile con MvcBuildViews habilitado ...
guidupuy
2
¡El "HtmlEncodedString" no funciona! En su lugar, use: RawString. ¡Vea un ejemplo que funciona! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {return new RazorEngine.Text.RawString ("<div> ¡Hola! </div>");}
Charles
15

FYI tengo una bifurcación que incluye la sintaxis @ Html.Raw (...) aquí:

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

Tod Thomson
fuente
3
@ Html.Raw () no requirió configuración inicial. Buena solución.
MartinJH
Yo también. Pude generar etiquetas y valores HTML en Razor Code y pasarlo a Ver con ViewData y mostrarlo usando @ Html.Ras (ViewData ["NextEvent"]
JustJohn
3

Si tiene una clase base personalizada para sus plantillas, puede codificar el Writemétodo para que se comporte de manera similar a la plantilla MVC normal: si el valor de salida es, IHtmlStringno debería codificarlo.

Aquí está el código que estoy usando en mi TemplateBaseclase:

// 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
fuente
3

Estoy usando RazorEngine 3.8.2 y @Raw(Model.Content)funciona perfectamente bien para mí.

Curioso.netter
fuente
-1

Encontré que todos estos funcionaron conmigo.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)
MuniR
fuente
4
Está utilizando la biblioteca MVC que no está disponible en el motor de afeitar, por lo que esta no es una respuesta a la pregunta.
oligofren