2010-10-03 4 views
43

Je peux passer une variable de ASP.NET MVC en utilisant ceci:Passer tableau de MVC en javascript?

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

Ce travail très bien avec la chaîne ou entier, mais comment puis-je faire avec un tableau de chaînes? J'ai essayé de passer le tableau de la même manière mais la variable est définie sur System.String []?

Répondre

14

Cela devrait faire

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

vous devez vous débarrasser de la dernière virgule – Omu

+1

@Omu: Pas nécessairement. Les parseurs Javascript sont très tolérants dans ce domaine. Tous les navigateurs courants ne sont pas dérangés par les virgules de fin dans les tableaux. –

+0

cool, tout comme dans C# – Omu

2

Vous devez formater le tableau en une syntaxe de tableau JavaScript.

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

Ceci encadrera chaque entrée par des guillemets simples, puis les joindra avec des virgules entre crochets.

Mise à jour: suppression de la parenthèse supplémentaire.

+0

Désolé, mais je reçois l'exception suivante avec cette solution =) attendue – Banshee

+0

j'avais une parenthèse supplémentaire. Je l'ai enlevé. Essayez maintenant. –

3

quelque chose comme ceci:

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

+1 pour être le plus propre, le plus direct – STW

+0

Le problème avec celui-ci est qu'il n'enveloppe pas les valeurs de chaîne entre guillemets ce qui provoquerait une erreur JavaScript. –

+0

@Matthew Manela merci de me dire que, corrigé – Omu

43

Vous pouvez JSON sérialiser. De cette façon, pourrait peut transmettre des valeurs encore plus complexes et ne pas s'échapper des citations simples, doubles citations, etc:

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

écrire un assistant HTML pour ce faire serait encore mieux:

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

puis à votre avis:

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

Je dois admettre que c'est une approche beaucoup plus propre que ma réponse. Cela devrait être voté comme solution, pas mon message. –

+2

@ Adrien, tout est subjectif. Personnellement, je déteste voir C# dans les vues. Et je suis particulièrement allergique aux boucles dans les vues :-) De plus, ne pas encoder les chaînes que vous produisez est extrêmement dangereux et sujet aux attaques XSS. C'est pourquoi je préfère toujours m'appuyer sur des choses intégrées dans le framework pour ne pas avoir à m'échapper correctement, ... –

+1

Chaque fois que je vois Darin Dimitrov répondre à une question, je sais que j'aurai une solution. Merci! –

122

vous pouvez laisser .NET gérer tout le levage lourd pour vous avec cette simple ligne de code. Cela suppose que vous utilisez la syntaxe MVC Razor.

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

Pour les versions plus récentes de MVC, utilisez:

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

+4

+1 Brillant, très propre. – twoleggedhorse

+0

donner à cet homme plus de votes négatifs! – mmcrae

+0

C'est tellement incroyable! Je ne savais pas que cela était pris en charge dans Razor, donc sacrément bon! – Hajjat

0

Je voulais juste apporter une réponse en utilisant la syntaxe Razor:

Nous avons un Dictionary<int, int> que nous rendons pour un jQuery Sparkline, sous la forme d'un "tableau de tableaux".

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

qui est utilisé comme ceci:

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

C'est ce que nous obtenons lors de l'affichage de la source:

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

Une doublure:

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

Alors facile, s o simples

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

sortie est:

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

En utilisant Json.NET

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