2009-09-24 15 views
23

¿Existe alguna función de utilidad para escaparse de JavaScript en las vistas ASP.NET MVC? A menudo necesito iniciar un pequeño fragmento de JavaScript usando algunos valores de la vista; por ejemplo, es posible que tenga algo como:Escapar literals de cadenas de JavaScript en las vistas

<script type="text/javascript"> 
var page = new Page({ currentUser: "<%= Model.UserName %>" }); 
page.init(); 
</script> 

yo esperaría algo como:

<script type="text/javascript"> 
var page = new Page({ currentUser: "<%= Html.JavaScriptEscape(Model.UserName) %>" }); 
page.init(); 
</script> 

Podría, por supuesto, escribir la función de mí mismo. Pero dado que ya existen utilidades integradas de codificación HTML, y dado que uno de los puntos de venta de ASP.NET MVC es que el <%%> es el modo de representación predeterminado, y dado que lo que intento lograr es bastante común , me hace preguntarme por qué no puedo encontrar algo así ya incorporado. ¿Existe, por ejemplo, una manera fácil y elegante de serializar un objeto a JSON en vistas?

¿O estoy haciendo algo en contra de los principios de ASP.NET MVC? Cuando llego a un problema como este, generalmente hace pensar que o bien estoy haciendo algo mal, ya que supongo que los diseñadores del framework pasaron algún tiempo pensando en escenarios del mundo real.

Respuesta

8

Después de un tiempo trabajando en ASP.NET MVC, llegué a la conclusión de que (lo más probable) no existe una ayuda incorporada para ello. Por supuesto, es trivial escribir el tuyo. Aquí es que en aras de la exhaustividad:

using System.Web.Mvc; 
using System.Web.Script.Serialization; 

namespace MyProject.Helpers 
{ 
    public static class JsonExtensions 
    { 
     public static string Json(this HtmlHelper html, object obj) 
     { 
      JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); 
      return jsonSerializer.Serialize(obj); 
     } 
    } 
} 

en una vista, que puede ser utilizado de la siguiente manera:

<script type="text/javascript"> 
var page = new Page(<%= Html.Json(new { currentUser: Model.UserName }) %>); 
page.init(); 
</script> 
47

En .NET 4, la clase HttpUtility tiene una variedad de métodos de codificación estáticas para varios contextos, incluido un método JavaScriptStringEncode para este propósito particular.

Sin embargo, a menudo es más sencillo usar la deserialización JSON.

7

En MVC 5 utilizando plantillas de afeitar, lo siguiente es posible:

<script type="text/javascript"> 
    var page = new Page({ currentUser: @Html.Raw(Json.Encode(Model.UserName)) }); 
    page.init(); 
</script> 
0

En mi caso necesitaba una cadena no es un objeto JSON y esto es para Asp.Net Core:

@functions{ 
    public Microsoft.AspNetCore.Html.IHtmlContent ToJS(string value) 
    { 
     return Html.Raw("'" + value.Replace("'", "\\'").Replace("\r", "\\r").Replace("\n", "\\n") + "'"); 
    } 

    public Microsoft.AspNetCore.Html.IHtmlContent ToJS(int value) 
    { 
     return Html.Raw("" + value); 
    } 
} 

Esto escapará de los caracteres 'y fin de línea. También deja números (int) como un número. Esto podría estar sobrecargado para incluir flotante, decimal, etc. según sea necesario.

Por lo tanto, no tengo que pensar en ello o hacer algo diferente para cada tipo:

var serverName = @ToJS(m.ServerName); 
var appSiteUrl = @ToJS(m.SiteUrl); 
var facebookId = @ToJS(m.FacebookAppId); 
Cuestiones relacionadas