С# MVC 4: Передача массива JavaScript в представлении для контроллера

В MVC 4, как вы передаете массив JavaScript в представлении для функции в контроллере с AJAX?

Это не похоже на работу:

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

Проблема в том, что countryArray является глобальным массивом в представлении JavaScript, и я проверяю, что он имеет элементы в нем перед передачей. Однако, когда функция saveTable получает массив, функция говорит, что она получила массив с нулевой строкой [].

Я знаю только, что передача массивов из Контроллер в Вид, вы сериализуете сложные типы данных с помощью return Json(data, JsonRequestBehavior.AllowGet);, а затем десериализуете его, устанавливая его в переменная var.

Поэтому я, вероятно, должен сделать это и для этого, но как?

Изменить 1:

Ниже приведена сокращенная версия функции 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 not successful. 
    return "There must be at least one country in the Region.";
    //Yeah it always returning this b/c function_param is null;         
 }

Ответ 1

При сериализации массивов вам необходимо установить traditional: true.

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

Нашли это хорошее объяснение тому, что traditional: true делает: fooobar.com/questions/179335/...

EDIT:

Если вы не хотите использовать traditional: true, вы можете передать данные как строку с помощью JSON.stringify и указав contentType:

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

Ответ 2

Вы должны использовать на контроллере:

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

Должен делать работу, это для будущих пользователей.

Ответ 3

ваш Ajax:

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

в вашем контроллере:

using Newtonsoft.Json;

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

тогда вы сможете сделать foreach в своем контроллере.