2016-06-30 3 views
0

Я пытаюсь получить некоторые данные (многомерный массив) для моего контроллера GET (для отображения в модальном/диалоговом окне) из списка (пользователь проверяет некоторые значения и затем отправляется на модальное/диалоговое окно, которое должно отображать выбранные значения):Array to mvc controller with ajax

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

Когда я регистрирую эти данные, это выглядит нормально. Затем я использую это Аякса вызов:

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

Я модель для использования данных в действии (и частичный вид):

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

Это мое действие:

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

Но в действии 'theData' всегда равно null. Если я использую «POST» в ajax, вызвано действие POST, и я не хочу этого делать на этом шаге. Я хочу использовать действие POST после того, как пользователь внес некоторые изменения (например, изменение названия), а затем сохранит. Затем я делаю POST и сохраняю новые данные.

+0

'MyClass [] theData' не является многомерным массивом. И это должно быть 'data: JSON.stringify ({theData: data}),' –

+0

Так что я не могу использовать MyClass [] theData, или что вы имеете в виду? – Robin

+0

Да, конечно, вы можете - просто использовать 'data: JSON.stringify ({theData: data}),' - мой комментарий в том, что 'MyClass []' - массив (не многомерный массив) –

ответ

1

Параметр в методе Merge() является MyClass[] theData, который означает, что вам нужно отправить массив объектов , а не массив массивов. Начните с изменения сценария для генерации данных для

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

Далее, вам необходимо изменить метод к [HttpPost] (переименуйте его в случае необходимости, чтобы избежать какого-либо конфликта с любым существующим [HttpPost]public ActionResult Merge(..) методом).

Тогда вам необходимо изменить тип на "Post" и stringify данные с именем параметра методов перед его отправкой

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

Side Примечание: Если вы действительно хотели сделать это к способу [HttpGet], то необходимо было бы отправить данные как .../Merge?[0].Name=TEST&[0].Id=123&[1].Name=TEST&[1].Id=123 и т. д. (т. е. с индексаторами), однако обычно вы не должны отправлять коллекции объектов методу GET. Помимо уродливой строки запроса, вы можете превзойти ограничение строки запроса и выбросить исключение.

+0

Спасибо, Стивен! – Robin

0

Вы отправляете свои данные в виде строки. Не используйте JSON.stringify

Изменить data: JSON.stringify({ data }) в data: data

2

Пожалуйста, попробуйте этот

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