2010-08-11 4 views
1

$ Je suis en train de passer un tableau imbriqué à un contrôleur mvc asp.net comme ceci:passant tableaux imbriqués à l'aide asp.net mvc jQuery de .ajax

var subgroups = []; 
subgroups [0] = [["A", "Y"], 
       ["B", "Y"], 
       ["C", "Y"]]; 
subgroups [1] = [["D", "Z"], 
       ["E", "Z"], 
       ["F", "Z"]]; 

$.ajax({ url: "<%= Url.Content("~/Controller/Action") %>", data: { subgroups: subgroups }, 
     dataType: "json", context: document.body, success: function(data) { ... }); 

Le contrôleur résultant:

public ContentResult Action(List<string[][]> subgroups) { 
    ... 
} 

le problème est la variable sous-groupes résultant du contrôleur ressemble à ceci:

subgroups[0][0] == null; 
subgroups[0][1] == null; 
subgroups[0][2] == null; 
subgroups[1][0] == null; 
subgroups[1][1] == null; 
subgroups[1][2] == null; 

les valeurs de la profondeur Les tableaux imbriqués ne sont pas passés. Firebug rapporte les paramètres de ma demande ajax sont:

subgroups[0][0][] A 
subgroups[0][0][] Y 
subgroups[0][1][] B 
subgroups[0][1][] Y 
subgroups[0][2][] C 
subgroups[0][2][] Y 
subgroups[1][0][] D 
subgroups[1][0][] Z 
subgroups[1][1][] E 
subgroups[1][1][] Z 
subgroups[1][2][] F 
subgroups[1][2][] Z 

On dirait que la cause est que jQuery ne remplit pas dans ces indices de tableau parce que je peux résoudre le problème est que je formater les données:

subgroups [0] = [{ 0: "A", 1: "Y"}, ...]; 

Pourquoi jQuery place-t-il les index pour le tableau externe, mais pas pour le tableau interne? S'il vous plaît dites-moi qu'il existe une meilleure solution pour cela que de spécifier manuellement les touches numériques?

Répondre

1

dans le fichier "code.jquery.com/jquery-1.4.2.js~~V~~3rd" en ligne 5290:

buildParams(prefix + "[" + (typeof v === "object" jQuery.isArray(v) ? i : "") + "]", v); 

je change pour ce code:

buildParams(prefix + (typeof v === "object" jQuery.isArray(v) ? "[" + i + "]" : ""), v); 

et le résultat était bon . Je n'ai pas pu tester beaucoup plus de cas.

-je créer un billet dans jQuery.com pour voir si cela est un bug: Ticket #6900 (new bug)

mais:

public ContentResult Action(List<string[][]> subgroups) { 

pour cette modification, vous devez utiliser ce code:

public ContentResult Action(List<string[]> subgroups) { 
+0

+1 Pour être l'un des plus braves hommes jquery je suis venu à travers :) – Jimbo

+0

Votre solution n'a pas tout le travail pour moi, mais il m'a aidé à trouver une solution en changeant la ligne 5419 à: 'buildParams (préfixe + "[" + i + "]", v); ' Merci d'avoir ouvert un rapport de bug et d'avoir trouvé une solution. Je ne suis pas sûr s'il s'agit d'un bug ou d'un comportement jQuery prévu, mais pour les personnes qui exécutent ASP.net MVC ce comportement semble plus utile. –

+0

oui, j'ai copié le mauvais numéro de ligne, le droit est 5419. Merci –

0

Dans le cas où quelqu'un d'autre trébuche sur cette question comme je l'ai fait, mais n'aime pas l'idée de modifier jQuery pour travailler avec votre logiciel serveur particulier, J'ai fini par utiliser JSON.stringify() pour transmettre une chaîne JSON de tableaux imbriqués au serveur, puis décoder cette chaîne JSON sur le serveur.