Подтвердить что ты не робот

Сообщение Ajax для ASP.net MVC-контроллер - свойства объекта null

У меня есть пост ajax, который создается следующим образом:

var myData = [
    {
        id: "a",
        name: "Name 1"
    },
    {
        id: "b",
        name: "Name 2"
    }
];

$.ajax({
    type: 'POST',
    url: '/myurl/myAction',
    data: { items: myData },
    dataType: 'json',
    error: function (err) {
        alert("error - " + err);
    }
});

И контроллер MVC:

[HttpPost]
public JsonResult MyAction(MyClass[] items)
{

}

MyClass - просто простое представление данных:

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

Когда javascript делает почтовый запрос, действие контроллера действительно получает 2 элемента, однако свойства (id, name) в этих элементах являются нулевыми.

Проверяя запрос в скрипаче, тело выглядит следующим образом:

Name                 | Value
items[0][Name]       | Name 1
items[0][Id]         | a
items[1][Name]       | Name 2
items[1][Id]         | b

Я что-то пропустил?

4b9b3361

Ответ 1

Я что-то пропустил?

Да, взгляните на следующую статью, чтобы понять правильный формат проводов, который связывает связующее устройство по умолчанию для привязки коллекций. Другими словами, чтобы это работало, вместо:

items[0][Name]       | Name 1
items[0][Id]         | a
items[1][Name]       | Name 2
items[1][Id]         | b

Ваша полезная нагрузка должна выглядеть так:

items[0].Name       | Name 1
items[0].Id         | a
items[1].Name       | Name 2
items[1].Id         | b

К сожалению, с jQuery это может быть очень неприятно для достижения этой полезной нагрузки. По этой причине я бы рекомендовал использовать полезную нагрузку JSON, если вы хотите отправить сложные объекты/массивы на ваш сервер с помощью AJAX:

$.ajax({
    type: 'POST',
    url: '/myurl/myAction',
    data: JSON.stringify({ items: myData }),
    contentType: 'application/json',
    error: function (err) {
        alert("error - " + err);
    }
});

Замечания:

  • data: JSON.stringify({ items: myData }) вместо data: { items: myData }
  • Добавлено contentType: 'application/json'
  • Отказаться от dataType: 'json'

Теперь ваша полезная нагрузка выглядит следующим образом:

{"items":[{"id":"a","name":"Name 1"},{"id":"b","name":"Name 2"}]}

Ответ 2

вы можете использовать этот код для решения проблемы:

$.ajax({
    url: '/myurl/myAction',
    data: { '': items },
    method: "POST",
    dataType: 'json',
    success: function (xhr, status, response) {
    },
    error: function (xhr, status, response) {
    }
});

[HttpPost]
public JsonResult MyAction(IEnumerable<MyClass> items)
{

}