2013-04-11 5 views
5

Sul lato client ho un array associativo in cui memorizzo coppie "Guid" - "int". passo la matrice al server utilizzando JSON:Passare un array associativo usando json: quale tipo aspettarsi nel controller?

$.ajax({ 
     url: methodUrl, 
     type: 'POST', 
     async: false, 
     data: { values: items }, 
     dataType: 'json', 
     success: function (data) { 
      //... 
     } 
    }); 

L'oggetto cerco di trasmettere si presenta così (tratto da debugger Chrome):

items: Object 
    44f871e0-daee-4e1b-94c3-76d633a87634: 1 
    698ce237-3e05-4f80-bb0d-de948c39cd96: 1 

Nel regolatore Ho un metodo

public ActionResult Method(Dictionary<Guid, int> values) 
    { 

    } 

Tuttavia, i valori delle proprietà rimangono nulli. Con solo un elenco di Guids sul lato client e Elenco nel controller, tutto funziona correttamente. Ho il sospetto che dovrei scegliere un altro tipo per i valori nel controller, non nel dizionario. Ho anche provato ad aggiungere "tradizionale: true" alla richiesta Ajax, tuttavia senza successo.

Qualsiasi consiglio è apprezzato!

+0

Avete qualche controllo sul formato di array associativo? –

+0

Sì, ho il pieno controllo – Anelook

+0

@Anelook prova 'dati: articoli,' – I4V

risposta

4

Questo è quello che faccio quando si utilizza un comando POST:

var data = { 
    values: items 
} 

var obj = $.toJSON(data); 

$.ajax({ 
     url: methodUrl, 
     type: 'POST', 
     async: false, 
     data: obj, 
     dataType: 'json', 
     success: function (data) { 
      //... 
     } 
    }); 

Questo dovrebbe inviare con il tuo controller correttamente e non si dovrebbe usare un oggetto Dictionary, si dovrebbe abbinare gli oggetti dal lato client al lato server. Userei un oggetto personalizzato che ha un Guid e un int come proprietà in esso, e lo uso - .NET corrisponderà ai due. Detto questo, è perfettamente ragionevole usare un dizionario, ma questa è una preferenza personale.

cioè

public CustomObject 
{ 
    public Guid MyGuid { get; set; } 
    public int MyNumber { get; set; } 
} 

public ActionResult Method(List<CustomObject> values) 
{ 

} 

Con più parametri:

items.SecondNumber = yourVariable; 
// In reality, you'd have a loop around your items and set this SecondNumber. 

var data = { 
    values: items 
} 

var obj = $.toJSON(data); 


public CustomObject 
{ 
    public Guid MyGuid { get; set; } 
    public int MyNumber { get; set; } 
    public int SecondNumber { get; set; } // This is why we use CustomObject 
} 
+0

Con solo un tipo semplice come Guid-int, la corrispondenza manuale non è eccessiva? – Anelook

+0

Potenzialmente, ma ti mantiene in linea con le buone pratiche quando trasmetti le informazioni come client e controller. Inoltre, è più facile capire cosa sta succedendo quando manterrai il tuo codice in futuro. –

+0

'Elenco valori' - vorrei fare lo stesso –

2

Sebbene selezionato risposta thedixon come soluzione, sono riuscito alla fine di evitare di utilizzare eventuali classi aggiuntive.

La parte più importante è che il tipo di raccolta inviata al server deve essere un array javascript con tipi di valori-chiave. Per esempio, qui è l'oggetto che ho creato in js prima di inviare al server:

items : Array[2] 
0: Object 
key: "ddac666f-310f-4022-a22c-c542355b765e" 
value: 1 
1: Object 
key: "ce9ae5a6-e6a6-4bb6-b61c-b1cc324be049" 
value: 1 

Dopo questo è necessario stringa i e poi inviare al server.

var obj = JSON.stringify(items); 
    $.ajax({ 
     url: teilnahmen.AddNewTeilnahmenUrl, 
     type: 'POST', 
     traditional: true, 
     dataType: 'json', 
     data: obj, 
     contentType: "application/json", 
     success: function (data) { 
      //... 
     } 
    }); 

Sul lato server:

public ActionResult AddNewTeilnahmen(Dictionary<Guid, int> values) 
    { ... } 

credo ancora che questa soluzione è migliore, in quanto non richiede la creazione di classi che molto probabilmente non potrà mai essere riutilizzati e già esistenti in .NET. Ma come dice giustamente Thedixon, è una questione di gusti.

0

Oltre a Anelook ultimo commento, qui è la creazione di javascript array:

var items = []; 
$(something).each(function (index, element) { 
    var item = { "key": element.guid, "value": element.number }; 
    items.push(item); 
}); 
Problemi correlati