Сообщение веб-API не будет привязывать данные к параметрам метода

#asp.net-web-api2

#asp.net-web-api2

Вопрос:

Я ненавижу спрашивать, потому что есть много вопросов, связанных с этой проблемой, но я не получил ни одного, чтобы отправлять какие-либо данные в ASP.NET Метод Web API 2. Все это поступает и отправляется на один и тот же хост и порт.

Вот мой код на стороне сервера:

 [RoutePrefix("api/help")]
public class HelpAPIController : ApiController
...
public class Item {
    public string name { get; set; }
    public string position { get; set; }
}

[Route]
[HttpPost]
public void Post([FromBody] Item[] stuff)
        ;  // we get here but data is always null or zero items in array
}
  

Javascript:

 "use strict";
var a = [{ "name": "me", "position": "here" }, 
         { "name": "me", "position": "here" }, 
         { "name": "me", "position": "here" }];

jQuery.ajax({
    type: "POST",
    datatype: "application/json",
    url: "/api/help/",
    data: { "stuff": JSON.stringify(a) },
    success: function (data) { alert(data); },
    error: function (error) {
        ...
    }
});
  

Фактическое содержимое запроса (без жестких возвратов):

 stuff:[{"name":"me","position":"here"},
       {"name":"me","position":"here"},
       {"name":"me","position":"here"}]
  

Комментарии:

1. Работает ли он с a List<Item> вместо Item[] ?

2. @PetreTurcu Нет, и он даже не работает с одним объектом без массива (когда и сервер, и клиент не указывают массив.) Он имеет нулевые элементы или пустой.

Ответ №1:

  1. Вы не передаете тип контента на сервер. datatype какой тип ответа вы ожидаете от сервера. contentType это то, что вы отправляете. По умолчанию contentType в jQuery application/x-www-form-urlencoded; charset=UTF-8 . Вам нужно добавить / отредактировать:

     dataType: "json",
    contentType: "application/json",
      
  2. Вам не нужно оборачивать массив данных объектом. Это будет сделано:

     data: JSON.stringify(a),
      

Комментарии:

1. Да. Необходимы как ContentType, так и изменение JSON.stringify(a).

Ответ №2:

Попробуйте добавить contentType: "application/json" в свой Ajax POST.

У вас есть тип данных, который, я думаю, является тем, что вы ожидаете от сервера, тогда как ContentType — это то, что вы отправляете.

Комментарии:

1. Определенно исправлено в ContentType, но также пришлось изменить часть stringify. Тип содержимого был на 90% частью решения. Хотелось бы отметить два правильных ответа.