Я пришел сюда писать после того, как прочитал много тем о той же ошибке, что и сейчас.
У меня есть WEB API, который работает в GET, но не в POST. Когда я отправляю ему JSON с помощью POSTMAN, я получаю сообщение об ошибке в ModelState, которое является ModelError ModelBinding.
Это мой модельный класс:
[DataContract]
public class Employee
{
[DataMember]
public int ID { get; set; }
[DataMember(IsRequired = true)]
public string FirstName { get; set; }
[DataMember(IsRequired = true)]
public string LastName { get; set; }
}
Вот метод Post контроллера моего API:
public IHttpActionResult Post([FromBody]Employee emp)
{
if (!ModelState.IsValid)
return BadRequest("Invalid data");
...
return Ok();
}
В этом контроллере я передаю свой if, и он возвращает мне «недопустимые данные»
Я пробовал все, я удалил [DataContract] в своей модели, но ничего не работает.
Вот пример JSON, который я отправляю:
{
"FirstName" : "John",
"LastName" : "Malon"
}
Полный код от Postman:
POST /api/employees HTTP/1.1
Host: localhost:49463
Content-Type: application/json
cache-control: no-cache
Postman-Token: 5ac38b20-425a-4ac7-995a-323fbd0bb9a5
{
"FirstName" : "John",
"LastName" : "Malon",
}------WebKitFormBoundary7MA4YWxkTrZu0gW--
РЕДАКТИРОВАТЬ : Кажется, объект emp, который я получаю в методе Post, имеет значение null
Я видел этот пост: Параметр сообщения всегда равен нулю
Но английский не мой основной язык, и я не могу понять, как решить проблему с =
Я понимаю, что мне нужно поставить = в JSON, который я отправляю, верно?
Заранее спасибо за вашу помощь!
Именно ID автоматически инкрементируется с БД, я не хочу передавать его в JSON
Но можете ли вы просто проверить это с помощью Postman, чтобы проверить, не в этом ли проблема?
1) Вы отладили и проверили, какие свойства установлены для объекта emp. 2) Используя почтовый человек, вы пытались установить заголовок: ContentType >> application/json? 3) При отладке ModelState должен сообщить вам, почему он не работает...
@eVolve Я помещаю contentType в Json, и у меня есть только FirstName со значением {System.Web.Http.ModelBinding.ModelError} в ModelState в режиме отладки
@Tuco не работает с идентификатором в JSON
Получить ошибки из ModelState
@Tuco в _innerDictionnary в ModelState У меня есть это: {[emp.FirstName, System.Web.Http.ModelBinding.ModelState]}
Извините, если это звучит грубо, но, пожалуйста, выполните поиск на этом веб-сайте или в Google: "Веб-API получает ошибки ModelState"
@Tuco Я сказал, что сделал почти все темы в Интернете, поэтому, пожалуйста
Хорошо, попробуйте этот ответ, пожалуйста stackoverflow.com/a/11686747/3596441
@itsdeft, чтобы подтвердить, вы говорите нам, что при отладке вы можете видеть все свойства, которые вы отправили, назначенные в объекте emp? ModelState содержит свойство Errors, в котором должна быть строка, объясняющая причину сбоя. Вы еще не предоставили это. В почтальоне вы выбрали Post в качестве типа запроса?
@Tuco Список содержит пустую строку ...
@eVolve Да, я выбрал метод POST в Postman и НЕТ, я ничего не вижу, мой объект emp равен NULL
Ну, не могли бы вы опубликовать в этом посте свой почтовый запрос от почтальона? :) Я имею в виду сырой текст, с заголовками и всем остальным
@Tuco Хорошо, я только что добавил это! :)
В том, что вы делаете, нет ничего плохого!
Не могли бы вы добавить атрибут [DataContract] в свой класс Employee?
@Tuco К сожалению, этого не было в коде, который я разместил, но я его написал!
@Tuco Я обновил свой пост, я обнаружил, что мой объект был нулевым
Вы можете поделиться своим решением с github или где-нибудь, чтобы проверить его?





Убедитесь, что вы отправляете заголовок application/json от почтальона. В остальном я не вижу никаких проблем с размещенным кодом.
Вы определяете класс, который содержит необнуляемый int, но не предоставляете его в теле POST. Это всегда не пройдет проверку, если вы не укажете значение для этого свойства.
Если вы хотите, чтобы это удалось, вы можете либо -
Опция 1 — измените свою модель, чтобы она принимала нулевой идентификатор:
public class Employee
{
public int? ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Вариант 2 — укажите значение по умолчанию (но действительное!) int в теле POST, которое должно быть заменено кодом вашей базы данных/бэкенда после создания идентификатора:
{
"ID" : 0,
"FirstName" : "John",
"LastName" : "Malon"
}
Я тестировал идентификатор в своем JSON, но он тоже не работает.
Возможно, пытается проверить идентификатор, попробуйте отправить идентификатор: 0 или что-то в этом роде.