2010-10-03 32 views
43

puedo pasar una variable de MVC ASP.NET utilizando la siguiente: bien¿Pasar matriz de MVC a javascript?

var lastCategoryId = '<%=Model.CS.LastSelectedCategory %>'; 

Este trabajo con cadena o un entero pero ¿cómo puedo hacer con una matriz de cadenas? He intentado pasar la matriz de la misma manera pero la variable está configurada en System.String []?

Respuesta

14

Esto debería hacer

var someArray=[<%foreach (var s in myStringArray){%>'<%=s%>',<%}%>]; 
+0

tienes que deshacerte de la última coma – Omu

+1

@Omu: No necesariamente. Los analizadores de Javascript son muy indulgentes en esa área. A todos los navegadores comunes no les importa las comillas finales en las matrices. –

+0

genial, al igual que en C# – Omu

2

Debe formatear la matriz en una sintaxis de matriz de JavaScript.

var someArray = [<%= Model.SomeArray.Select(x => "'" + x +"'") 
          .Aggregate((x,y) => x + ", " + y); %>]; 

Esto rodeará cada entrada con comillas simples y luego las unirá con comas entre corchetes.

Actualizado: eliminado paréntesis adicional.

+0

Lo sentimos pero tengo la siguiente excepción con esta solución =) que se espera – Banshee

+0

que tenía un paréntesis extra. Lo quité. Probar ahora. –

3

algo como esto:

<script type="text/javascript"> 
var myArr = [<%=string.Join(",", strArr.Select(o => "\"" + o + "\"")) %>]; 
</script> 
+0

+1 por ser el más limpio, más al punto – STW

+0

El problema con esto es que no ajusta los valores de cadena entre comillas lo que causaría un error de JavaScript. –

+0

@Matthew Manela gracias por decirme que lo arregló – Omu

43

Se podría JSON serializar. De esta manera podría podría pasar valores aún más complejo y no preocuparse de escapar comillas simples, comillas dobles, etc:

var categoriesList = <%= new JavaScriptSerializer().Serialize(new[] { "value1", "value2" }) %>; 

escribir un asistente de HTML para hacer esto sería aún mejor:

public static class HtmlExtensions 
{ 
    public static string JsonSerialize(this HtmlHelper htmlHelper, object value) 
    { 
     return new JavaScriptSerializer().Serialize(value); 
    } 
} 

y luego en su opinión:

<script type="text/javascript"> 
    var categoriesList = <%= Html.JsonSerialize(new[] { "value1", "value2" }) %>; 
</script> 
+6

Tengo que admitir que es un enfoque mucho más limpio que mi respuesta. Esto debería votarse como la solución, no como mi publicación. –

+2

@Adrian, todo es subjetivo. Personalmente, odio ver C# en las vistas. Y soy particularmente alérgico a los bucles en las vistas :-) Además, no codificar las cadenas que estás emitiendo es extremadamente peligroso y está sujeto a ataques XSS. Es por eso que prefiero confiar siempre en las cosas integradas en el marco para no tener que preocuparme por escapar de manera apropiada, ... –

+1

Cada vez que veo a Darin Dimitrov respondiendo a una pregunta, sé que tendré una solución. ¡Gracias! –

122

usted puede dejar .NET manejar todo el trabajo pesado para usted con esta simple línea de código.

Esto supone que está utilizando la sintaxis de MVC Razor.

var yourJavaScriptArray = @Html.Raw(Json.Encode(Model.YourDotNetArray));

Para las versiones más recientes de MVC, utilice:

var yourJavaScriptArray = @Html.Raw(Json.Serialize(Model.YourDotNetArray));

+4

+1 Brillante, muy limpio. – twoleggedhorse

+0

¡dale a este hombre más votos positivos! – mmcrae

+0

¡Esto es tan asombroso! No sabía que esto era compatible con Razor, ¡qué bueno! – Hajjat

0

Sólo quería dar una respuesta utilizando la maquinilla de afeitar sintaxis:

Tenemos un Dictionary<int, int> el que estamos procesando para jQuery Sparkline, en forma de "una matriz de matrices".

var usageData = [ @string.Join(",", Model.UsageData.Select(d => string.Format("[{0},{1}]", d.Key, d.Value)).ToArray()) ]; 

que se utiliza de esta manera:

$('#sparkline').UsageSparkline(usageData, { tooltipFormatter: cachedTooltips }); 

Esto es lo que obtenemos cuando se ve la fuente:

var usageData = [ [-13,0],[-12,1],[-11,0],[-10,0],[-9,1],[-8,1],[-7,0],[-6,2],[-5,2],[-4,0],[-3,0],[-2,9],[-1,3],[0,4] ]; 
$('#sparkline').UsageSparkline(usageData, { tooltipFormatter: cachedTooltips }); 
2

Un forro:

var data = [@Html.Raw(String.Join(",", Model.MyArray.Select(i => "'" + i + "'")))]; 
2

Así fácil, s O sencilla

<script type="text/javascript"> 
    var array = @Html.Raw(
     Json.Encode(
      (Model).Select(m=> new 
      { 
       id= m.ID, 
       name=m.Name 
      }) 
     ) 
    ); 
</script> 

de salida es:

[{"id":1,"name":"Name of 1"}, {"id":2,"name":"Name of 2"}, ...]; 
1

Usando Json.NET

var yourlist = JSON.parse('@Html.Raw(JsonConvert.SerializeObject(Model.YourList))'); 
Cuestiones relacionadas