2011-08-19 3 views
7

J'essaie et j'ai du mal à envoyer un tableau via JSON à une action de contrôleur MVC.Envoyer un tableau au contrôleur MVC via JSON?

Voici ce que j'ai et ce que j'ai essayé ...

//Get checked records 
var $checkedRecords = $(':checked'); //e.g. 3 rows selected = [input 4, input 5, input 6] 

//Have tried following: 
sendingVar: $checkedRecords.serializeArray(); // gives array of 0's 
sendingVar: JSON.stringify($checkedRecords); // gives "{\"length\":1,\"prevObject\":{\"0\":{\"jQuery1313717591466\":1,\"jQuery1313717591653\":13},\"context\":{\"jQuery1313717591466\":1,\"jQuery1313717591653\":13},\"length\":1},\"context\":{\"jQuery1313717591466\":1,\"jQuery1313717591653\":13},\"selector\":\":checked\",\"0\":{}}"...wtf 

//Post 
$.post(url, { sendingVar: sendingVar }, function(data) {alert(data); }); 

Comment puis-je faire?

modifier: à ceux qui suggèrent d'envoyer $checkedRecords "tel quel" de la ligne supérieure - cela ne fonctionne pas. Je reçois une étrange exception quelque part dans le cadre jquery :(

uncaught exception: [Exception... "Could not convert JavaScript argument" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: http://.../.../.../jquery-1.4.4.min.js :: <TOP_LEVEL> :: line 141" data: no] 

que je pense signifie qu'il tente d'affecter null à quelque chose qu'il ne peut pas

Edit:. J'utilise MVC2 pas 3

Edit2: Après @ réponse- le problème de lundi est dû à la façon dont je l'ai construit le tableau comme[input 4, input 5, input 6] et non [4,5,6] - des idées comment je peux obtenir les valeurs dans le tableau à la place

Edit3: Arrêtez de voter en double lorsque ce n'est pas le cas. Avez-vous réellement lu mon problème ou lu les problèmes liés? c'est une autre question

@Daveo:

I don't want to build in an overriding custom attribute just to send an array from JSON, that is rediculous comme nous l'avons déjà couvert dans cette question-n'est pas nécessaire.

MVC3 - irrelevant

+1

double possible: http://stackoverflow.com/questions/320291/how-to-post-an-array- de-complexes-objets-avec-json-jquery-à-asp-net-mvc-control et http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to- asp-net-mvc3 – Daveo

+0

Quel est votre résultat souhaité? Votre tableau est d'objets jQuery, la version stringify me semble juste. À quoi vous attendez-vous? – BZink

+0

c'est juste un tableau contenant les ID de chaîne des éléments vérifiés. Je veux que checkRecords contienne un tableau de tous les ID des éléments sélectionnés. La valeur de l'entrée sélectionnée contient la valeur d'ID dont j'ai besoin. – baron

Répondre

22

Voici ma démo, utilisez MVC2, espère que certains aide ~

La clé du succès est traditional

régler le paramètre traditional true

$(function(){ 
    var a = [1, 2]; 
    $.ajax({ 
     type: "POST", 
     url: "<%= ResolveUrl("~/Home/PostArray/") %>", 
     data: {orderedIds: a}, 
     dataType: "json", 
     traditional: true, 
     success: function(msg){alert(msg)} 
    }); 
}) 

Depuis jquery 1.4 Ce paramètre existe car le mécanisme de sérialisation des objets dans les paramètres de requête a changé.

et l'action est ~

[HttpPost] 
public ActionResult PostArray(int[] orderedIds) 
{ 
    return Content(orderedIds.Length.ToString()); 
} 
+0

Malheureusement, cela ne fonctionne pas. 'orderedIds' est null dans la méthode du contrôleur. Je soupçonne parce ajax fait réellement un 'GET'? – baron

+1

@baron - Dans mon emplacement, cela fonctionne très bien. 'orderedIds' est un nom de paramètre – Monday

+1

Hmmm excuses, vous avez raison ce code fonctionne. Donc le problème réside dans la façon dont j'obtiens le tableau des ID vérifiés avec 'var $ checkedRecords = $ (': checked');' qui me donne '[input 3, input 4, input 5]' où j'en ai vraiment besoin: ' [1, 2] '. Merci – baron

0

vous pouvez également utiliser JSON.stringyfy à envoyer les données sous forme de chaîne puis utilisez JavaScriptSerializer class retrive les données.

Dans le code C#, pour obtenir les données, ressemblera à ceci:

JavaScriptSerializer js = new JavaScriptSerializer(); 

js.Deserialize<T>(string paramiter); 
Questions connexes