2016-06-30 11 views
0

Ich versuche, einige Daten (multidimensionales Array) zu meinem GET-Controller (für die Anzeige in einem Modal/Dialogfeld) aus einer Liste (der Benutzer überprüft einige Werte und wird dann an a gesendet) modal/Dialogfeld, das die gewählten Werte angezeigt werden soll):Array zu MVC-Controller mit AJAX

$('input:checkbox').each(function() { 
    if ($(this).is(':checked')) { 
     var prop= []; 
     prop['Name'] = "TEST"; 
     prop['Id'] = "123" 
     data.push(prop); 
    } 
}); 

Als ich dies (oben) Daten einzuloggen, es sieht gut aus. Dann benutze ich den Ajax-Aufruf:

$.ajax({ 
    type: "GET", 
    url: url, 
    data: JSON.stringify({ data }), 
    contentType: "application/json; charset=utf-8", 
    success: function() { 
     alert("OK"); 
    } 
}); 

Ich habe ein Modell für die Verwendung der Daten in der Aktion (und die Teilansicht):

public class MyClass 
{ 
    public string Name { get; set; } 
    public string Id { get; set; } 
} 

Das ist meine Aktion:

public ActionResult Merge(MyClass[] theData) 
    { 
     ... 
    } 

Aber in der Aktion ist die 'theData' immer Null. Wenn ich 'POST' im Ajax verwende, wird die POST-Aktion aufgerufen, und das möchte ich in diesem Schritt nicht tun. Ich möchte die POST-Aktion danach nutzen, wenn der Benutzer einige Änderungen vorgenommen hat (zB Titelwechsel) und dann speichert. DANN mache ich einen POST und speichere die neuen Daten.

+0

'MyClass [] theData' ist kein mehrdimensionales Array. Und es muss sein: data: JSON.stringify ({theData: data}), ' –

+0

Also kann ich MyClass [] theData nicht verwenden, oder was meinst du? – Robin

+0

Ja, natürlich können Sie - einfach 'data verwenden: JSON.stringify ({theData: data}),' - mein Kommentar ist, dass 'MyClass []' ein Array ist (kein multidimensionales Array) –

Antwort

1

Den Parameter in Ihrer Merge() Methode ist MyClass[] theData was bedeutet, Sie müssen eine Reihe von Objekten senden , kein Array von Arrays. Beginnen Sie, indem Sie das Skript zu ändern, die Daten zu

var data = []; 
$('input:checkbox').each(function() { 
    if ($(this).is(':checked')) { 
     data.push({ Name: 'TEST', Id: '123' }); 
    } 
}); 

Weiter zu erzeugen, müssen Sie die Methode auf eine [HttpPost] (benennen Sie es bei Bedarf einen Konflikt mit jedem vorhandenen [HttpPost]public ActionResult Merge(..) Verfahren zu vermeiden) ändern.

Dann müssen Sie den Typen "Post" ändern und die Daten mit dem Namen der Methoden Parameter stringify bevor es

$.ajax({ 
    type: 'Post', // change this 
    url: url, 
    data: JSON.stringify({ theData: data }), // change this 
    contentType: 'application/json; charset=utf-8', 
    success: function() { 
     alert("OK"); 
    } 
}); 

Randnotiz zu senden: Wenn Sie dies zu einer [HttpGet] Methode wollten tun, dann es wäre notwendig, die Daten als .../Merge?[0].Name=TEST&[0].Id=123&[1].Name=TEST&[1].Id=123 usw. (dh mit Indexern) zu senden, jedoch sollten Sie im Allgemeinen Sammlungen von Objekten nicht an eine GET-Methode senden. Abgesehen von der hässlichen Abfragezeichenfolge könnten Sie das Abfragezeichenfolgenlimit überschreiten und eine Ausnahme auslösen.

+0

Danke Stephen! – Robin

0

Sie senden Ihre Daten als Zeichenfolge. Nicht JSON.stringify verwendet

ändern data: JSON.stringify({ data }) zu data: data

2

Bitte versuchen Sie diesen

$('input:checkbox').each(function() { 
     if ($(this).is(':checked')) { 
      var prop= {}; 
      prop.Name = "TEST"; 
      prop.Id = "123" 
      data.push(prop); 
     } 
    });