2010-11-01 45 views
133

estoy tratando de escribir un objeto como JSON a mi Asp.Net MVC Ver usando la maquinilla de afeitar, así:¿Cómo escribo Json sin codificar en mi vista usando Razor?

<script type="text/javascript"> 
    var potentialAttendees = @Json.Encode(Model.PotentialAttendees); 
</script> 

El problema es que en la salida de la JSON se codifica, y mi navegador no lo hace gusta. Por ejemplo:

<script type="text/javascript"> 
    var potentialAttendees = [{&quot;Name&quot;:&quot;Samuel Jack&quot;},]; 
</script> 

¿Cómo hago que Razor emita JSON sin codificar?

+2

+1 para la buena pregunta. Estaba buscando escribir una publicación para preguntar esto, pero me salvó el tipeo ... – gyurisc

Respuesta

171

lo hace:

@Html.Raw(Json.Encode(Model.PotentialAttendees)) 

En versiones anteriores de Beta 2 le hice así:

@(new HtmlString(Json.Encode(Model.PotentialAttendees))) 
+3

¿Qué puedo hacer si quiero texto codificado en las propiedades de mis objetos? \, {\ "UrlPart \": \ "TjcolklFX5c \", \ "Título \": \ "Cuando Mama Isn \ u0027t Home \"}, {\ " Por ejemplo. Esto se romperá porque js piensa que 'se escape de la cadena decalration nativa de la var a =' 'mismo ocurre con "". idea Anny? – SomeRandomName

+0

@SomeRandomName puede usar 'javascriptserializer' para que al igual que ' @ Html.Raw (javascriptSerializerObjecct.Serialize (myObject)) ' – vikscool

+0

Estamos en 2017, usando MVC 5 y esta respuesta todavía es perfecta! –

9

Usando Newtonsoft

<script type="text/jscript"> 
    var potentialAttendees = @(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.PotentialAttendees))) 
</script> 
35

de JsonConvert.SerializeObject Newtonsoft no se comporta igual que Json.Encode y hacer lo que sugiere @ david-k-egghead te abre a Ataques XSS.

Coloque este código en una vista Razor para ver que el uso de Json.Encode es seguro y que Newtonsoft puede hacerse seguro en el contexto de JavaScript, pero no sin un trabajo adicional.

<script> 
    var jsonEncodePotentialAttendees = @Html.Raw(Json.Encode(
     new[] { new { Name = "Samuel Jack</script><script>alert('jsonEncodePotentialAttendees failed XSS test')</script>" } } 
    )); 
    alert('jsonEncodePotentialAttendees passed XSS test: ' + jsonEncodePotentialAttendees[0].Name); 
</script> 
<script> 
    var safeNewtonsoftPotentialAttendees = JSON.parse(@Html.Raw(HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(
     new[] { new { Name = "Samuel Jack</script><script>alert('safeNewtonsoftPotentialAttendees failed XSS test')</script>" } }), addDoubleQuotes: true))); 
    alert('safeNewtonsoftPotentialAttendees passed XSS test: ' + safeNewtonsoftPotentialAttendees[0].Name); 
</script> 
<script> 
    var unsafeNewtonsoftPotentialAttendees = @Html.Raw(JsonConvert.SerializeObject(
     new[] { new { Name = "Samuel Jack</script><script>alert('unsafeNewtonsoftPotentialAttendees failed XSS test')</script>" } })); 
    alert('unsafeNewtonsoftPotentialAttendees passed XSS test: ' + unsafeNewtonsoftPotentialAttendees[0].Name); 
</script> 

Consulte también:

+0

¿Tiene alguna idea de cuándo agregaron Json.Encode? No sabía que había de hecho, es una forma segura de insertar json en la página y sé que hice mucha investigación sobre ella en el pasado. –

+1

'Json.Encode' ha existido desde que puedo recordar, pero la desventaja es que usa la implementación de Microsoft que genera fechas no estándar (y puede hacer otras cosas molestas). Uso y animo el uso de 'JsonConvert.SerializeObject' de Newtonsoft combinado con el escape adecuado porque tiene una mejor salida. –

+2

Me alegro de haber bajado. Inmediatamente vi la respuesta aceptada, esperaba que hubiera una manera segura de hacerlo. – frostymarvelous

Cuestiones relacionadas