2011-10-28 14 views
14

Quando invio una lista di int di con jQuery come questo:Come inviare un elenco di int con jQuery per ASP.net MVC predefinito modello Binder

$.ajax('@Url.Action("Execute")', { 
    type: 'POST', 
    data: { 
     pkList: [1,2,3] 
    } 
}); 

Poi jQuery sarà trasformare l'oggetto pkList e inviarlo via post come questo:

pkList[]:1 
pkList[]:2 
pkList[]:3 

che sarebbe bene se il server è PHP, ma io uso Asp.NET MVC3 e cercare di ottenere questi valori con il legante modello predefinito:

public ActionResult Execute(ICollection<int> pkList) 

Ma pkList è sempre nullo, sembra che il modello predefinito non sia in grado di collegarlo.

Come si risolve correttamente?


AGGIUNTOSOLUZIONE

ho usato la soluzione da Darin Dimitrov con impostando l'opzione traditional in jQuery:

$.ajax('@Url.Action("Execute")', { 
    type: 'POST', 
    traditional: true, 
    data: { 
     pkList: [1,2,3] 
    } 
}); 

Ora jQuery non aggiunge l'[] ai parametri più e vengono inviati in questo modo:

pkList:1 
pkList:2 
pkList:3 

E il raccoglitore modello predefinito MVC ottiene i valori correttamente.

Spero che questo aiuti qualcuno.

risposta

16

Si potrebbe utilizzare una richiesta JSON in quanto vi permetterà di inviare eventuali oggetti complessi che si desidera:

$.ajax({ 
    url: '@Url.Action("Execute")', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ pkList: [1, 2, 3] }), // you could throw any javascript object you like here 
    success: function(result) { 
     // process the results 
    } 
}); 

Il metodo JSON.stringify è costruito in browser moderni e se si desidera supportare legacy browser potresti includere lo script json2.js sul tuo sito.

E per rispondere alla tua domanda si potrebbe usare impostare l'opzione traditional: true per indicare a jQuery il fallback su tradizionale serializzazione dei parametri dal momento che questo è cambiato in jQuery 1.4 e se si utilizza una versione successiva si ha la possibilità di passare torna ai parametri modo in cui vengono serializzati:

$.ajax({ 
    url: '@Url.Action("Execute")', 
    type: 'POST', 
    data: { 
     pkList: [1, 2, 3] 
    }, 
    traditional: true 
}); 
+0

Will not il legante modello predefinito anche gestire elenchi separati da virgole di dati codificati di modulo? Qualcosa come 'data: {pkList: '1,2,3'}'? Ma altrimenti uso questo metodo per tutta la serializzazione del mio modello, la strada da percorrere per oggetti più complessi in JS. –

+0

@PaulT., No, il raccoglitore modello predefinito non accetta 'data: {pkList: '1,2,3'}'. Se si desidera gestire tali richieste, sarà necessario un raccoglitore modello personalizzato in cui sarà necessario suddividere le voci e quindi analizzare ciascuna di esse su un numero intero.Non sarebbe necessario passare attraverso questo dolore se l'obiettivo è quello di inviare un array di numeri interi a un'azione del controller. –

+0

ah sì capisco cosa intendi adesso, l'ho appena testato, è strano perché se hai due ingressi con lo stesso nome lo deserializzi in realtà in una lista, solo la serializzazione di jQuery per formare i dati del post non la gestisce (cioè .pkList = 1 & pkList = 2 funziona) –

0

Phil Haack ha un grande articolo sul suo blog che dovrebbe indicarti la giusta direzione.

Model Binding To A List

+0

Grazie compagno, ho letto che prima, ma non mi aiuta, il problema era più sul lato jQuery :) – Marc

Problemi correlati