2011-11-26 16 views
8

Ho una serie di stringhe in JS. Tutti i membri sono in realtà numeri.
Il mio controller ha un parametro int [].Controller JS int array a MVC3

io mando da jQuery:

$.ajax({url: someUrl, data: {ids : JSON.stringify(id_array) }, ...) 

e ricevo utilizzando

public ActionResult MyAction(int[] ids) { ... 

Il parametro non viene compilato, ho controllato, il Request.Form["ids"] contiene "[\"25\",\"26\"]", la stringa rappresentazione dell'array JSON C'è un modo per farlo automaticamente senza un sacco di analisi?

risposta

11

Non avete provato a stringifying la matrice e lasciando che il modello di default di MVC vincolante fare la magia

$.ajax({url: someUrl, data: {ids : id_array }, ...) 

Sono abbastanza sicuro .net MVC vedrà la matrice e vedere si tratta di un array di int e la mappa al tuo array di int correttamente

+0

sì, Request.Form [ "ids []"] avranno il valore "25,26", int [ ] non ancora vincolante. – TDaver

+11

@TDaver è necessario impostare la proprietà .ajax "tradizionale" su true affinché la serializzazione dell'array superficiale funzioni correttamente in base a http://api.jquery.com/jQuery.param/ e allo –

+1

manca solo la bandiera tradizionale. Grazie – TDaver

0

è necessario utilizzare

$.ajax({ 
    url: someUrl, 
    data: id_array.map(function(item){ return {name:'ids',value:item}; }) 
}) 

Questo perché al fine di ricevere un elenco sul back-end, i dati devono essere inviati in forma ids=3&ids=5&ids=1&ids=7


Per le versioni di IE che non supportano l'uso .map

function arrayToParamObject(name,array){ 
    var obj = []; 
    for (var i = 0, len = array.length; i< len; i++){ 
     obj.push({name: name, value: array[i] }); 
    } 
    return obj; 
} 

e lo utilizzano

$.ajax({ 
    url: someUrl, 
    data: arrayToParamObject('ids', id_array) 
}) 
4

è possibile farlo in due modi diversi

1. Usa $. ajax per inviare dati alla tua azione

$.ajax({ 
    url: '/myController/myAction', 
    dataType: 'json', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    traditional: true, 
    data: $.toJSON(json), 
    success: function (data, textStatus, jqXHR) { 
    ... 
    } 
}); 

La vostra azione dovrebbe apparire come questo

public class myController 
{ 
    [HttpPost] 
    public ActionResult myAction(List<int> json) 
    { 
     .... 
    } 
} 

2. Usa $ .post per pubblicare i dati

$.post(
    '/myController/myAction', 
    { json: $.toJSON(products) }, 
    function (data) { 
    ... 
}); 

Nella vostra azione dovrebbe deserializzare la stringa JSON

public class myController 
    { 
    public ActionResult myAction(string json) 
    { 
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     List<int> list = serializer.Deserialize<List<int>>(json); 
    } 
} 

È necessario scaricare e includere jquery.json-2.2.min.js nel codice.

http://code.google.com/p/jquery-json/downloads/detail?name=jquery.json-2.2.min.js

+0

questo è molto meno automatico di quello che stavo puntando ... – TDaver

11

Per MVC3 è necessario configurare jQuery per utilizzare tradizionale, la serializzazione "superficiale" .. Visualizza here.

lato client richiesta AJAX:

jQuery.ajaxSettings.traditional = true; //enable "shallow" serialisation globally 
$.get("someUrl", {ids : id_array }); 

Metodo Azione:

public ActionResult MyAction(string[] ids) { ... } 
+0

Grazie! Accetterò comunque Keith.Abramo, come il suo è stato il primo – TDaver