2011-08-19 31 views
7

Sto provando, e faccio fatica, a inviare un array tramite JSON a un'azione del controller MVC.Invia array al controller MVC tramite JSON?

Ecco quello che ho e quello che ho provato ...

//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); }); 

Come posso fare?

modifica: a quelli che suggeriscono di inviare $checkedRecords "come è" dalla riga superiore - che non funziona. Ottengo una strana eccezione in qualche parte del framework 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] 

che credo significa che sta tentando di assegnare null a qualcosa che non può

Edit:. Sto utilizzando MVC2 non 3

Edit2:? Dopo la @ di Lunedi risposta- il problema è dovuto al modo in cui ho costruito la matrice come[input 4, input 5, input 6] e non [4,5,6] - tutte le idee come posso ottenere solo i valori nella matrice invece

Edit3: smetti di votare su duplicato quando non lo è. Hai effettivamente letto il mio problema o letto i problemi collegati? questo è un problema diverso

@Daveo:

I don't want to build in an overriding custom attribute just to send an array from JSON, that is rediculous come abbiamo già trattato in questa domanda: non è necessario.

MVC3 - irrelevant

+1

possibile duplicato di: http://stackoverflow.com/questions/320291/how-to-post-an-array- di-complex-objects-con-json-jquery-to-asp-net-mvc-controller e http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to- asp-net-mvc3 – Daveo

+0

Qual è il tuo risultato desiderato? La tua matrice è di oggetti jQuery, la versione stringify mi sembra giusta. Cosa ti aspetti che assomigli? – BZink

+0

è solo un array contenente gli ID di stringa degli elementi selezionati. Voglio checkedRecords per contenere una matrice di tutti gli ID degli elementi selezionati. Il 'valore' dell'ingresso selezionato contiene il valore ID che mi serve. – baron

risposta

22

Ecco il mio demo, utilizzare MVC2, speranza certa aiuta ~

La chiave del successo è traditional

impostare il parametro 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)} 
    }); 
}) 

Dal jquery 1.4 questo parametro esiste perché il meccanismo per serializzare oggetti nei parametri di query è cambiato.

e l'azione è ~

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

Sfortunatamente, questo non funziona. 'orderedIds' è null nel metodo del controller. Sospetto perché ajax fa effettivamente un 'GET'? – baron

+1

@baron - Nella mia posizione, funziona correttamente. 'orderedIds' è un nome parametro – Monday

+1

Hmmm scuse, sei corretto questo codice funziona. Quindi il problema sta nel modo in cui ottengo la matrice di ID verificati con 'var $ checkedRecords = $ (': checked');' che mi dà '[input 3, input 4, input 5]' di cui ho effettivamente bisogno: ' [1, 2] '. Grazie – baron

0

è anche possibile utilizzare JSON.stringyfy da inviare i dati come una stringa quindi utilizzare JavaScriptSerializer class per retrive i dati.

Nel codice C#, per ottenere i dati, sarà simile a questa:

JavaScriptSerializer js = new JavaScriptSerializer(); 

js.Deserialize<T>(string paramiter); 
Problemi correlati