working update section scripts not net mvc from asp asp.net-mvc json razor

asp.net-mvc - update - render partial view mvc 5 ajax



¿Cómo escribo Json sin codificar en mi View usando Razor? (3)

Estoy intentando escribir un objeto como JSON en mi Asp.Net MVC View usando Razor, así:

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

El problema es que en el resultado el JSON está codificado, y a mi navegador no le 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?


El JsonConvert.SerializeObject de JsonConvert.SerializeObject no se comporta de la misma manera que Json.Encode y hacer lo que @ david-k-egghead sugiere te abre a los ataques XSS .

Suelte 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 deja de tener 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>

Ver también:


Tú lo haces:

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

En versiones anteriores a Beta 2 lo hiciste como:

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


Usando Newtonsoft

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