2012-07-12 24 views
18

He visto algunas publicaciones sobre este tema y algunos blogs, pero ninguno parece mencionar la salida que recibo.Cómo crear una cadena de javascript en razor

Lo que quiero es generar un mapa de Google Maps con información sobre él. Al ingresar manualmente la información se obtiene la información correcta. Entonces esa parte funciona

Donde me quedo atascado es cuando voy a dynamiccaly crear la matriz javascript con la cadena con la información que quiero en mi mapa.

El código HTML que quiero llegar es:

<script type="text/javascript">  
    var projects = [ 
     ['Kantoor 4.1 bestaande bouw', 52.25446, 6.16024700000003, 'Deventer', '', 'adviseurs', 'rating30'], 
     ['School nieuw 4.0', 52.243161, 4.43677860000003, 'Noordwijk', '', 'adviseurs', 'rating30'], 
    ]; 

muy sencilla matriz de JavaScript, por lo que pensé para crear con:

<script type="text/javascript"> 
var projects = [ 
    @foreach (var item in Model) 
    { 
     @HttpUtility.JavaScriptStringEncode("['" + item.Gebouwnaam + "', " + item.LocatieLatitude.ToString().Replace(",", ".") + ", " + item.LocatieLongitude.ToString().Replace(",", ".") + ", '" + item.Plaats + "', '" + item.Gebruiksfunctie + "', '" + item.Licentiehouder + "', '" + item.rating + "'],"); 
    } 
]; 
</script> 

Sin embargo, esto me da:

<script type="text/javascript"> 
var projects = [ 
    [\u0027Kantoor 4.1 bestaande bouw\u0027, 52.25446, 6.16024700000003, \u0027Deventer\u0027, \u0027\u0027, \u0027adviseurs\u0027, \u0027rating30\u0027], 
    [\u0027School nieuw 4.0\u0027, 52.243161, 4.43677860000003, \u0027Noordwijk\u0027, \u0027\u0027, \u0027adviseurs\u0027, \u0027rating30\u0027], 
]; 
</script> 

Escapar las comillas simples no funciona. ¿Qué estoy haciendo mal?

+0

quizá relevantes para otros, esto parece ser un método interesante y la maquinilla de afeitar s combinación de yntaxis: http://stackoverflow.com/questions/4599169/using-razor-within-javascript –

Respuesta

16

Sólo probamos con

<script type="text/javascript"> 
var projects = [ 

    @Html.Raw("['" + "aaa" + "', " + "bbb" + "'],") 


]; 
</script> 

funcionó y mostró ...

<script type="text/javascript"> 
var projects = [ 

     ['aaa', bbb'], 


]; 
</script> 
+0

esto funciona de manera brillante, gracias. Esto me estaba dando dolores de cabeza desde ayer –

+1

lol ... aplicar SO a todos sus dolores de cabeza en el futuro;) – Yasser

+1

¿No te pierdes un 'antes' bbb "? – radbyx

12

Usted no quiere llamar JavaScriptStringEncode en toda la cadena, que también codificar sus indicadores literales (que se están convirtiendo a \ u0027 en tu ejemplo). En su lugar, lo llaman en cada elemento de la matriz de la siguiente manera:

<script type="text/javascript"> 
var projects = [ 
    @foreach (var item in Model) 
    { 
     String.Format("['{0}',{1},{2},'{3}','{4}','{5}','{6}']", 
         HttpUtility.JavaScriptStringEncode(item.Gebouwnaam), 
         HttpUtility.JavaScriptStringEncode(item.LocatieLatitude.ToString().Replace(",", ".")), 
         HttpUtility.JavaScriptStringEncode(item.LocatieLongitude.ToString().Replace(",", ".")), 
         HttpUtility.JavaScriptStringEncode(item.Plaats), 
         HttpUtility.JavaScriptStringEncode(item.Gebruiksfunctie), 
         HttpUtility.JavaScriptStringEncode(item.Licentiehouder), 
         HttpUtility.JavaScriptStringEncode(item.rating) 
     ) 
    } 
]; 
</script> 
+0

¿Hay alguna razón por la que debería usar esta solución y no @ Html.Raw? –

+3

Html.raw no escapará caracteres que tengan un significado especial en Javascript (como comillas simples). Dependiendo de sus datos, esto podría generar errores en el tiempo de ejecución. –

2

Creo que podría hacer la mayor parte del trabajo pesado en Html.Raw .NET y palanca para transformar el objeto de que:

@{ 
    var myObj = Model.Select(i => new { 
     item.Gebouwnaam, 
     item.LocatieLatitude.ToString().Replace(",", "."), 
     item.LocatieLongitude.ToString().Replace(",", "."), 
     item.Plaats, 
     item.Gebruiksfunctie, 
     item.Licentiehouder, 
     item.rating }).ToArray(); 
} 

<script type="text/javascript"> 
    var jsObj = @Html.Raw(myObj); 
</script> 

Puesto que ha tocado en esta pregunta, HttpUtility.JavaScriptStringEncode() viene en muy práctico para las cadenas que contienen caracteres de nueva línea:

@{ var myNetString = "Hi,\r\nMy name is Joe\r\nAnd I work in a button factory"; } 

<script type='text/javascript'> 
    var myJsString = '@HttpUtility.JavaScriptStringEncode(myNetString)'; 
</script> 
Cuestiones relacionadas