2013-04-11 4 views
5

Auf der Client-Seite habe ich ein assoziatives Array, wo ich "Guid" - "int" -Paare speichern. I das Array an den Server unter Verwendung von json passieren:Übergeben eines assoziativen Arrays mit json: welcher Typ im Controller zu erwarten?

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

Das Objekt ich versuche sieht wie folgt (aus Chrom Debugger) zu übergeben:

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

In der Steuerung habe ich ein Verfahren

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

    } 

Eigenschaftswerte bleiben jedoch null. Mit nur einer Liste von Guids auf der Client-Seite und Liste in der Steuerung funktioniert alles gut. Ich vermute, dass ich einen anderen Typ für Werte im Controller wählen sollte, nicht Dictionary. Ich habe auch versucht, "traditionell: wahr" zu der Ajax-Anfrage hinzuzufügen, jedoch ohne Erfolg.

Jeder Rat wird geschätzt!

+0

Haben Sie die Kontrolle über das assoziative Array-Format haben? –

+0

Ja, ich habe die volle Kontrolle – Anelook

+0

@Anelook versuchen 'Daten: Artikel,' – I4V

Antwort

4

Dies ist, was ich tun, wenn eine POST-Befehl:

var data = { 
    values: items 
} 

var obj = $.toJSON(data); 

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

Dies sollte ordnungsgemäß mit dem Controller-senden durch, und Sie sollten Objekte nach oben nicht von Client-Seite passen, ein Dictionary-Objekt verwenden, müssen Sie sollten zur Serverseite. Ich würde ein benutzerdefiniertes Objekt verwenden, das eine Guid und eine int als Eigenschaften darin hat, und verwenden Sie das - .NET wird die beiden oben übereinstimmen. Davon abgesehen ist es durchaus sinnvoll, ein Dictionary zu verwenden, aber das ist eine persönliche Vorliebe.

heißt

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

public ActionResult Method(List<CustomObject> values) 
{ 

} 

mit mehreren Parametern:

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

Mit nur einem einfachen Typ wie Guid-Int, ist nicht manuelle Übereinstimmung ein Overkill? – Anelook

+0

Möglicherweise, aber es hält Sie in Einklang mit guten Praktiken bei der Weitergabe von Informationen Client und Controller. Außerdem ist es einfacher herauszufinden, was passiert, wenn Sie Ihren Code in Zukunft pflegen. –

+0

'List Werte' - ich würde das gleiche tun –

2

Obwohl ich thedixon Antwort als Lösung ausgewählt, konnte ich am Ende mit beliebigen zusätzlichen Klassen zu vermeiden.

Der wichtigste Teil ist, dass der Typ der Sammlung, die an den Server gesendet wird, ein JavaScript-Array mit Schlüsselwerttypen sein sollte. Zum Beispiel, hier ist das Objekt, das ich in js erstellt, bevor an den Server gesendet:

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

Danach ist es notwendig, es stringify und dann an den Server senden.

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

Auf der Serverseite:

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

Ich glaube immer noch, dass diese Lösung besser ist, da es nicht zu schaffen Klassen erfordert, die höchstwahrscheinlich nie und bereits in .NET existiert wiederverwendet werden. Aber wie der Dixon richtig erwähnt, ist es Geschmackssache.

0

Zusätzlich letzten Kommentar Anelook, hier ist die Erstellung von JavaScript-Array:

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