Emitir cadenas no codificadas en una vista de Razor

81

Como dice ScottGu en su blog después «de contenido predeterminado emitida utilizando un bloque @ es automáticamente HTML codificada a una mejor protección contra los escenarios de ataque XSS». Mi pregunta es: ¿cómo se puede generar una cadena no codificada en HTML?

En aras de la simplicidad, los pls se adhieren a este simple caso:

@{
 var html = "<a href='#'>Click me</a>"
 // I want to emit the previous string as pure HTML code...
}
hemme
fuente

Respuestas:

17

Puede crear una nueva instancia de MvcHtmlString que no se codificará en HTML.

@{
  var html = MvcHtmlString.Create("<a href='#'>Click me</a>")
}

Con suerte, habrá una forma más fácil en el futuro de Razor.

Si no está usando MVC, puede probar esto:

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}
aolde
fuente
2
En realidad, también debería poder usar new HtmlString()en MVC 3, ya que ese tipo es .NET 4.
marque el
¡En efecto! Sin embargo, al escribir todo eso en una expresión, me gusta el MVC una más. Por ejemplo, @ MvcHtmlString.Create (myString). ¡Preferencia personal!
aolde
6

new HtmlString es definitivamente la respuesta.

Analizamos algunos otros cambios de sintaxis de razor, pero al final ninguno de ellos terminó siendo realmente más corto que el nuevo HtmlString.

Sin embargo, podemos envolver eso en un ayudante. Posiblemente...

@Html.Literal("<p>something</p>")

o

@"<p>something</p>".AsHtml()
Erik Porter
fuente
1
¿Sería posible agregar @ = myString como una forma de generar HTML? Tal vez demasiado de un flashback a WebForms ...
aolde
2
Queremos evitar agregar construcciones de sintaxis donde no cubran un caso de usuario importante. La mayoría de las veces, utilizará métodos auxiliares para construir cadenas e IHtmlString funciona perfectamente allí. Para los casos impares en los que necesita generar una cadena literal sin un ayudante, podemos proporcionarle un método: @Literal (foo) o similar.
Andrew Stanton-Nurse
0

También encontré este problema al realizar la transición de nuestro proyecto al nuevo motor de vista de Razor. El enfoque que tomé fue ligeramente diferente porque teníamos que generar datos JSON desde C # y queríamos generarlos al cargar la página.

Lo que finalmente hice fue implementar un RawView que era un paralelo de View dentro de los archivos cshtml. Básicamente, para obtener una cadena sin procesar,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

Esto requiere algunos cambios en el diseño del proyecto, así que acabo de escribir una publicación de blog al respecto aquí . En resumen, esto requirió una implementación duplicada del DynamicViewDataDictionary de MVC y una nueva WebViewPage que contiene RawView. También seguí adelante e implementé el operador de índice en RawView para permitir

@RawView["Foo"]

En la remota posibilidad de que alguien necesite recorrer los datos con una lista de claves.

Al leer el comentario de una enfermera, probablemente hubiera sido mejor si hubiera nombrado esto como Literal en lugar de RawView.

Anh-Kiet Ngo
fuente
0

Estoy usando ASP.NET MVC y Razor en Mono.

No pude obtener HtmlHelper de System.Web.WebPages de System.Web.Mvc por algunas razones.

Pero logré generar una cadena no codificada después de declarar la propiedad del modelo como RazorEngine.Text.RawString. Ahora sale como se esperaba.

Ejemplo

@{
    var txt = new RawString("some text with \"quotes\"");
    var txt2 = "some text with \"quotes\"";
}
<div>Here is unencoded text: @txt</div>
<div>Here is encoded text: @txt2</div>

Salida:

<div>Here is unencoded text: some text with "quotes"</div>
<div>Here is encoded text: some text with &quot;quotes&quot;</div>
porfirion
fuente