web-dev-qa-db-fra.com

C # MVC 4: Passage d'un tableau JavaScript dans View to Controller

Dans MVC 4, comment passez-vous un tableau JavaScript dans la vue à une fonction du contrôleur avec AJAX?

Cela ne semble pas le travail:

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

Le problème est que countryArray est un tableau global dans la vue JavaScript et j'ai vérifié qu'il contient des éléments avant d'être transmis. Toutefois, lorsque la fonction saveTable reçoit le tableau, elle dit avoir reçu un tableau null string []. 

Je sais seulement qu'en passant des tableaux du Controller au View , vous sérialisez des types de données complexes avec return Json(data, JsonRequestBehavior.AllowGet);, puis vous le dé-sérialisez en lui donnant une variable "var".

Donc, je dois probablement le faire pour cela aussi, mais comment faire?

Modifier 1:

Voici la version abrégée de la fonction SaveTable:

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;         
 }
11
RedAces

Vous devez définir traditional: true lors de la sérialisation des tableaux.

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

Vous avez trouvé cette bonne explication sur ce que fait traditional: true: https://stackoverflow.com/a/5497151/2419531

MODIFIER:

Si vous ne souhaitez pas utiliser traditional: true, vous pouvez transmettre les données sous forme de chaîne à l'aide de JSON.stringify et en spécifiant la variable contentType:

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

Vous devriez utiliser sur votre contrôleur:

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

Devrait faire le travail, c'est pour les futurs utilisateurs.

2
LP. Gonçalves

votre Ajax:

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

dans votre contrôleur: 

using Newtonsoft.Json;

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

alors vous pourrez faire une foreach dans votre contrôleur.