Pregunta Emitir cadenas no codificadas en una vista Razor


Como dice ScottGu en su blog enviar «Por defecto, el contenido emitido utilizando un bloque @ se codifica automáticamente en HTML para proteger mejor 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 apegan a este simple caso:

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

76
2017-07-28 19:41


origen


Respuestas:


Este es mi enfoque favorito:

@Html.Raw("<p>my paragraph text</p>")

La fuente fue la referencia de sintaxis Razor de Phil Haack: http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx


107
2018-02-07 22:47



Puede crear una nueva instancia de MvcHtmlString que no recibirá codificación HTML.

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

Esperemos que haya una manera más fácil en el futuro de Razor.

Si no está utilizando MVC, puede intentar esto:

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}

17
2017-07-28 20:46



nuevo HtmlString es definitivamente la respuesta.

Investigamos otros cambios en la sintaxis de la afeitadora, pero finalmente ninguno de ellos terminó siendo más corto que el nuevo HtmlString.

Sin embargo, podemos envolverlo en un ayudante. Posiblemente...

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

o

@"<p>something</p>".AsHtml()

6
2017-07-29 01:15



También me encontré con este problema al hacer la transición de nuestro proyecto al nuevo motor Razor view. 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 eventualmente hice fue implementar un RawView que era un paralelo de View dentro de los archivos cshtml. Esencialmente, para obtener una cadena sin procesar,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

Esto requiere algunos cambios en el diseño del proyecto, por lo que acabo de escribir una publicación de blog al respecto aquí. En resumen, esto requirió una implementación duplicada de 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 el caso de que alguien necesite pasar los datos por una lista de claves.

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


0
2017-08-18 22:21