Escritura / salida de cadenas HTML sin escape

436

Tengo HTML seguro / desinfectado guardado en una tabla DB.

¿Cómo puedo escribir este contenido HTML en una vista Razor?

Siempre escapa a personajes como <y hacia símbolos &amp;.

AGS
fuente
76
Para salvar a la gente la larga historia de discusión a continuación -@Html.Raw()
Chris S
Para salvar a personas como yo que intentan hacer esto con tipos anónimos en vistas escritas dinámicamente, donde esto no funcionará, vea esta respuesta a mi pregunta más específica. Aunque usar este enfoque con una vista fuertemente tipada es aún mejor si su situación lo permite.
brichins

Respuestas:

653

Supongamos que su contenido está dentro de una cadena llamada mystring...

Puedes usar:

@Html.Raw(mystring)

Alternativamente, puede convertir su cadena a HtmlStringcualquier otro tipo que se implemente IHtmlStringen el modelo o directamente en línea y usar regular @:

@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
Lorenzo
fuente
Gracias por esta respuesta Me ayudó a terminar una pequeña tarea que estaba aprendiendo. :) Sin embargo, estoy usando la última versión de MVC3 y hasta ahora no tengo Html.Raw :(
1
Hola Sergio. Estoy usando MVC 3 y estoy usando el método Raw correctamente.
Gui
1
¡Gracias por la respuesta! Todavía estoy aprendiendo MVC 3 y esto me estaba eludiendo.
Todd Richardson el
3
@Lorenzo, +1 Estoy usando el último MVC 3 con razorsintaxis y Html.Rawdefinitivamente estoy disponible para mí.
Chris Snowden
1
Lorenzo, he actualizado la respuesta para eliminar la mención de MVC Beta como lo fue hace algunos años. Siéntase libre de revertir / cambiar.
Alexei Levenkov
75

En ASP.NET MVC 3, debe hacer algo como esto:

// Say you have a bit of HTML like this in your controller:
ViewBag.Stuff = "<li>Menu</li>"
//  Then you can do this in your view:
@MvcHtmlString.Create(ViewBag.Stuff)
Tom Chantler
fuente
13
Prefiero este método porque HTML.Raw explota si la cadena pasada es nula.
37Estrellas
1
Gracias, esto está muy limpio!
Hajjat
64

Puedes usar

@{ WriteLiteral("html string"); }
Andrus
fuente
55
Esto fue increíble para mí, estaba usando Razor dentro de una aplicación Hangfire para enviar correos electrónicos ... Html.Raw()no funciona allí
shanabus
1 para WriteLiteral
muhammed basil
11

A veces puede ser complicado usar html sin formato. Principalmente debido a la vulnerabilidad XSS. Si eso es una preocupación, pero aún desea usar html sin procesar, puede codificar las partes aterradoras.

@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")

Resultados en

(<b>&lt;script&gt;console.log('insert')&lt;/script&gt;Hello</b>)
Travis J
fuente
4

Puede poner su cadena en viewdata en el controlador de esta manera:

 ViewData["string"] = DBstring;

Y luego llame a esa vista de datos a la vista de esta manera:

@Html.Raw(ViewData["string"].ToString())
Ajay
fuente
0

Ejemplo completo para usar funciones de plantilla en RazorEngine (para la generación de correo electrónico, por ejemplo):

@model SomeModel
@{
    Func<PropertyChangeInfo, object> PropInfo =
        @<tr class="property">
            <td>
                @item.PropertyName                
            </td>
            <td class="value">
                <small class="old">@item.OldValue</small>
                <small class="new">@item.CurrentValue</small>                
            </td>
        </tr>;
}

<body>

@{ WriteLiteral(PropInfo(new PropertyChangeInfo("p1", @Model.Id, 2)).ToString()); }

</body>
ZlobnyiSerg
fuente