2010-07-28 26 views
76

Como dice ScottGuard en su blog post «el contenido predeterminado emitido con 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?Emitir cadenas no codificadas en una vista Razor

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

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

Respuesta

17

se puede crear una nueva instancia de MvcHtmlString que no conseguirá HTML codificado.

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

Afortunadamente, habrá una manera más fácil en el futuro de Razor.

Si no se está usando MVC, puede intentar esto:

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

realidad que deberán ser llenados capaz de usar 'nueva HtmlString()' en MVC 3, así, ya que el tipo de es .NET 4. – marcind

+0

¡De hecho! Sin embargo, al escribir todo eso en una expresión, me gusta MVC uno más. P.ej. @ MvcHtmlString.Create (myString). ¡Preferencia personal! – aolde

6

nueva HtmlString es definitivamente la respuesta.

Revisamos algunos otros cambios en la sintaxis de la hoja de afeitar, pero finalmente ninguno de ellos terminó siendo más corto que el nuevo HtmlString.

Podemos, sin embargo, incluirlo en un ayudante. Posiblemente ...

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

o

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

¿Sería posible agregar @ = myString como salida de HTML? Tal vez demasiado de un flashback a WebForms ... – aolde

+2

Queremos evitar agregar construcciones de sintaxis donde no cubren un caso de usuario importante. La mayoría de las veces, utilizará métodos de ayuda para construir cadenas y IHtmlString funciona perfectamente allí. Para los casos extraños donde necesita generar una cadena literal sin un ayudante, podemos proporcionarle un método: @Literal (foo) o similar. –

0

me encontré con este problema también al realizar la transición de nuestro proyecto para el nuevo motor de vistas 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. Esencialmente, para obtener una cadena prima,

@(new HtmlString(View.Foo)) 

// became 
@RawView.Foo 

Esto requiere algunos cambios en el diseño del proyecto, por lo que acabo de escribir una entrada de blog sobre él here. En resumen, esto requirió una implementación duplicada de DynamicViewDataDictionary de MVC y una nueva WebViewPage que contiene RawView. También fui por delante y aplicado el operador de índice en la RawView para permitir

@RawView["Foo"] 

En la remota posibilidad de que alguien necesita para recorrer los datos con 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.

Cuestiones relacionadas