¿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?


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)

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


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

3

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



-1

Encontré que todos estos funcionaron conmigo.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.