Passa l’array all’azione mvc tramite AJAX

Sto provando a passare un array (o IEnumerable) di ints da via AJAX a un’azione MVC e ho bisogno di un piccolo aiuto.

il javascript è

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

e l’azione del controller è

 public ActionResult MyAction(IEnumerable arrayOfValues ) 

Al momento la richiesta è formattata come

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

Quindi sono quasi arrivato, se prendo le parentesi quadre ottengo la risposta corretta. Come dovrei passare quell’array nel mio get in modo che il controller possa riconoscere di cosa si tratta?

Molte grazie per il vostro aiuto

Dave

Impostare la proprietà tradizionale su true prima di effettuare la chiamata get. vale a dire:

 jQuery.ajaxSettings.traditional = true $.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {... 

Ho avuto problemi in passato quando tentavo di eseguire un POST (non sono sicuro che sia esattamente quello che stai facendo, ma ricordo che quando passi un array, il tradizionale deve essere impostato su true .

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

Un po ‘tardi, ma una risposta diversa a quelle già presenti qui:

Se invece di $.ajax ti piacerebbe utilizzare le funzioni abbreviate $.get o $.post , puoi passare gli array in questo modo:

Stenografia OTTIENI

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

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

Stenografia

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

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

Gli appunti:

  • Il parametro booleano in $.param è per la proprietà traditional , che DEVE essere true perché funzioni .

La risposta per usare l’opzione “tradizionale” è corretta. Sto solo fornendo alcune informazioni di base per questo che desiderano saperne di più.

Dalla documentazione di jQuery:

A partire da jQuery 1.8, il metodo $ .param () non utilizza più jQuery.ajaxSettings.traditional come impostazione predefinita e verrà impostato su false.

Puoi anche leggere di più qui: http://michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-answers e http://haacked.com/archive /2008/10/23/model-binding-to-a-list.aspx

HTH

Dovresti essere in grado di farlo bene:

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

Quindi il tuo metodo di azione sarebbe così:

 public ActionResult(List myKey) { // Do Stuff } 

Per te, sembra che tu debba solo stringificare i tuoi valori. JSONValueProvider in MVC lo convertirà nuovamente in IEnumerable per te.

SE TUTTI GLI ALTRI FALLISCONO…

Nessuna delle altre risposte ha risolto il mio problema. Stavo tentando di effettuare una chiamata al metodo GET da JavaScript a un controller MVC Web API e di inviare un array di numeri interi come parametro all’interno di quella richiesta. Ho provato tutte le soluzioni qui, ma il parametro sul mio controller era ancora in arrivo NULL (o Nothing for you VB users).

Alla fine ho trovato la mia soluzione in un post SO diverso , ed in realtà era davvero semplice: basta aggiungere l’annotazione [FromUri] prima del parametro array nel controller ( dovevo anche effettuare la chiamata usando l’impostazione “tradizionale” AJAX per evitare la parentesi annotazioni ). Vedi sotto per il codice effettivo che ho usato nella mia applicazione.


Firma del controller:

Firma del controller NOTA: l’annotazione in C # sarebbe [FromUri]


JavaScript:

 $.get('/api/InventoryApi/GetBalanceField', $.param({productIds: [42], inventoryFormId: 5493, inventoryBalanceType: 'Beginning'},true)).done(function(data) {console.log(data);}); 

Stringa URL effettiva:

 http://randomhostname/api/InventoryApi/GetBalanceField?productIds=42&inventoryFormId=5493&inventoryBalanceType=Beginning 

Devi convertire Array in stringa:

 //arrayOfValues = [1, 2, 3]; $.get('/controller/MyAction', { arrayOfValues: "1, 2, 3" }, function (data) {... 

questo funziona anche in forma di int, long o string

 public ActionResult MyAction(int[] arrayOfValues )