2014-01-22 2 views
10

In MVC 4, wie übergibt man ein JavaScript-Array in der Ansicht auf eine Funktion im Controller mit AJAX?C# MVC 4: Übergeben von JavaScript-Array in Ansicht an Controller

Dies scheint nicht die Arbeit:

$.ajax(
     { 
      type: "POST", 
      url: "../Home/SaveTable", 
      data: { function_param: countryArray } 
     }); 

Problem ist, ist countryArray ein globales Array in der JavaScript-Ansicht, und ich habe Sie sicher, dass es Elemente in sich hat, bevor übergeben wird. Wenn die saveTable-Funktion das Array empfängt, sagt die Funktion jedoch, dass sie ein null string [] -Array empfangen hat.

Ich weiß nur, dass Arrays von dem -Controller zur Ansicht Sie serialisiert komplexe Datentypen mit return Json(data, JsonRequestBehavior.AllowGet); und dann deserialisieren es, indem es auf ein „var“ Variable übergeben.

Also muss ich wahrscheinlich auch dafür, aber wie?

Edit 1:

Hier ist die verkürzte Version der SaveTable Funktion:

public string SaveTable(string[] function_param) 
{ 
    if (function_param != null && function_param > 0) 
    { 
     //some code     
     return "Success"; 
    } 

    //The following code will run if it's not successful. 
    return "There must be at least one country in the Region."; 
    //Yeah it's always returning this b/c function_param is null;   
} 
+2

Wie sieht der Controller aus? –

+0

Überprüfen Sie die Nutzdaten Ihrer Anfrage, um festzustellen, ob tatsächlich Daten an den Controller gesendet werden. – Saravana

+0

@Mark Mein Controller verfügt über ActionResult-Methoden zum Zurückgeben von Sichten und Methoden zum Zugriff auf die Datenbank. Dies ist eine Funktion, die verwendet wird, um auf die Datenbank gemäß dem übergebenen Array zuzugreifen. – RedAces

Antwort

19

Sie müssen traditional: true setzen, wenn Arrays serialisiert.

$.ajax({ 
    type: "POST", 
    traditional: true, 
    url: "../Home/SaveTable", 
    data: { function_param: countryArray } 
}); 

diese gute Erklärung gefunden, was traditional: true tut: https://stackoverflow.com/a/5497151/2419531

EDIT:

Wenn Sie wollen traditional: true nicht verwenden, können Sie die Daten als Zeichenfolge mit JSON.stringify passieren kann und die Angabe die contentType:

$.ajax({ 
    type: "POST", 
    url: "../Home/SaveTable", 
    contentType: 'application/json', 
    data: JSON.stringify({function_param: countryArray}), 
}); 
+0

Ich schaute auf Ihren Link und die Antwort dort impliziert, dass der traditionelle Weg überholt ist und der neue Weg besser ist. Was ist also der Vorteil der traditionellen Verwendung für die Serialisierung von Arrays? – RedAces

+1

Wie auch immer, es hat nicht funktioniert, die Funktion bekommt immer noch ein null string [] Array. – RedAces

+0

Siehe meine aktualisierte Antwort. – Saravana

2

Sie sollten auf Ihrem Controller verwenden:

public string SaveTable(object[] function_param) 
{ 
    //some code 
} 

Sollte die Arbeit tun, ist es für zukünftige Benutzer.

+1

Eine großartige Lösung, danke. – spadelives

0

Ihre Ajax:

$.ajax({ 
    type: "POST", 
    url: "../Home/SaveTable", 
    contentType: 'application/json', 
    data: {function_param: JSON.stringify(countryArray)}, 
}); 

in Ihrem Controller:

using Newtonsoft.Json; 

    public string SaveTable(string function_param) 
    { 
     dynamic func_param = JsonConvert.DeserializeObject(function_param) 
    } 

dann werden Sie in der Lage sein, eine foreach in Ihrem Controller zu tun.

Verwandte Themen