125 votes

Passer un tableau à l'action mvc via AJAX

J'essaie de passer un tableau (ou IEnumerable) d'ints via AJAX à une action MVC et j'ai besoin d'un peu d'aide.

le javascript est

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {...

et l'action du contrôleur est

public ActionResult MyAction(IEnumerable<int> arrayOfValues )

Pour le moment, la demande est formatée comme suit

controller/MyAction?_=1301503418429&arrayOfValues[]=491&arrayOfValues[]=368&arrayOfValues[]=235&arrayOfValues[]=437

J'y suis presque, si j'enlève les crochets, j'obtiens la bonne réponse. Comment dois-je passer ce tableau dans mon get pour que le contrôleur puisse reconnaître ce qu'il est ?

Merci beaucoup pour votre aide

Dave

151voto

Chandu Points 40028

Définissez la propriété traditionnelle à true avant de faire l'appel get. C'est-à-dire

jQuery.ajaxSettings.traditional = true

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {...

3 votes

Merci ! pourriez-vous décrire les différences entre l'ajax traditionnel et non traditionnel ? j'aimerais mieux comprendre ce que je fais pour le reste de mon application.

5 votes

Vous pouvez également ajouter le paramètre traditionnel à un seul appel. Cela n'affectera alors pas le reste

1 votes

Cette réponse est correcte, mais si vous préférez définir "traditionnel" pour un appel unique, consultez la réponse de @RionWilliams. Je vote pour les deux. Merci !

124voto

Rion Williams Points 22784

J'ai eu des problèmes dans le passé lorsque j'ai essayé d'exécuter un POST (je ne suis pas sûr que ce soit exactement ce que vous faites, mais je me souviens qu'il s'agissait de passer un tableau, traditionnel doit être mis à true .

 var arrayOfValues = new Array();

 //Populate arrayOfValues 
 $.ajax({ 
      type: "POST",
      url: "<%= Url.Action("MyAction","Controller")%>",
      traditional: true,
      data: { 'arrayOfValues': arrayOfValues }              
 });

4 votes

C'est tellement mieux que de le définir aveuglément de manière globale dans un fichier web.config, comme le suggèrent certaines personnes. L'autre a son lot de bonnes occasions, mais la vôtre devrait être la solution par défaut.

0 votes

Il s'agit juste d'envoyer des données en tant que paramètre à l'ActionResult, est-ce que cela va invoquer le code à l'intérieur de l'ActionResult ? Par exemple, s'il y a un code pour insérer un tableau de valeurs dans la base de données, ce code sera-t-il exécuté ?

0 votes

Cela a résolu exactement ce dont j'avais besoin. Mes tableaux revenaient toujours comme nuls dans mon contrôleur jusqu'à ce que j'ajoute ceci et les obtienne dans mon contrôleur comme : IEnumerable<string> array

55voto

SNag Points 1342

Un peu tard, mais différents réponse à celles déjà présentes ici :

Si au lieu de $.ajax vous souhaitez utiliser des fonctions abrégées $.get ou $.post vous pouvez passer des tableaux de cette manière :

GET en abrégé

var array = [1, 2, 3, 4, 5];
$.get('/controller/MyAction', $.param({ data: array }, true), function(data) {});

// Action Method
public void MyAction(List<int> data)
{
    // do stuff here
}

POST sténographique

var array = [1, 2, 3, 4, 5];
$.post('/controller/MyAction', $.param({ data: array }, true), function(data) {});

// Action Method
[HttpPost]
public void MyAction(List<int> data)
{
    // do stuff here
}

Notes :

  • Le paramètre booléen dans $.param est pour le traditional propriété, qui DOIT être true pour que cela fonctionne .

2 votes

Merci pour l'astuce concernant la propriété traditionnelle. Je n'arrivais pas à comprendre pourquoi mon paramètre C# était nul. J'ai découvert que le type "int[]" fonctionne également dans la méthode Action de C#.

9voto

Tom Gerken Points 91

La réponse qui consiste à utiliser l'option "traditionnelle" est correcte. Je ne fais que fournir quelques informations de base supplémentaires pour ceux qui souhaitent en savoir plus.

Extrait de la documentation de jQuery :

À partir de jQuery 1.8, la méthode $.param() n'utilise plus jQuery.ajaxSettings.traditional comme paramètre par défaut et sera par défaut et prendra la valeur false.

Vous pouvez également lire la suite ici : http://michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-answers y http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

HTH

9voto

Tejs Points 23834

Vous devriez être en mesure de le faire sans problème :

$.ajax({
   url: 'controller/myaction',
   data: JSON.stringify({
      myKey: myArray
   }),
   success: function(data) { /* Whatever */ }
});

Votre méthode d'action serait alors la suivante :

public ActionResult(List<int> myKey)
{
    // Do Stuff
}

Pour vous, il semble que vous ayez juste besoin de stringifier vos valeurs. Le JSONValueProvider de MVC reconvertira ces valeurs en IEnumerable pour vous.

0 votes

Merci pour la réponse, mais il semble que je doive mettre traditionnel à true. J'ai voté en haut de page car je pense que cela fonctionnerait aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X