Ошибка привязки модели, когда метод POST вызывает веб-API

Я пришел сюда писать после того, как прочитал много тем о той же ошибке, что и сейчас.

У меня есть 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"
}

Ошибка привязки модели, когда метод POST вызывает веб-API

Полный код от 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, который я отправляю, верно?

Заранее спасибо за вашу помощь!

Возможно, пытается проверить идентификатор, попробуйте отправить идентификатор: 0 или что-то в этом роде.

The One 27.02.2019 19:32

Именно ID автоматически инкрементируется с БД, я не хочу передавать его в JSON

user10218123 27.02.2019 19:34

Но можете ли вы просто проверить это с помощью Postman, чтобы проверить, не в этом ли проблема?

The One 27.02.2019 19:36

1) Вы отладили и проверили, какие свойства установлены для объекта emp. 2) Используя почтовый человек, вы пытались установить заголовок: ContentType >> application/json? 3) При отладке ModelState должен сообщить вам, почему он не работает...

eVolve 27.02.2019 19:37

@eVolve Я помещаю contentType в Json, и у меня есть только FirstName со значением {System.Web.Http.ModelBinding.ModelError} в ModelState в режиме отладки

user10218123 27.02.2019 19:40

@Tuco не работает с идентификатором в JSON

user10218123 27.02.2019 19:41

Получить ошибки из ModelState

The One 27.02.2019 19:43

@Tuco в _innerDictionnary в ModelState У меня есть это: {[emp.FirstName, System.Web.Http.ModelBinding.ModelState]}

user10218123 27.02.2019 19:46

Извините, если это звучит грубо, но, пожалуйста, выполните поиск на этом веб-сайте или в Google: "Веб-API получает ошибки ModelState"

The One 27.02.2019 19:47

@Tuco Я сказал, что сделал почти все темы в Интернете, поэтому, пожалуйста

user10218123 27.02.2019 19:50

Хорошо, попробуйте этот ответ, пожалуйста stackoverflow.com/a/11686747/3596441

The One 27.02.2019 19:51

@itsdeft, чтобы подтвердить, вы говорите нам, что при отладке вы можете видеть все свойства, которые вы отправили, назначенные в объекте emp? ModelState содержит свойство Errors, в котором должна быть строка, объясняющая причину сбоя. Вы еще не предоставили это. В почтальоне вы выбрали Post в качестве типа запроса?

eVolve 27.02.2019 19:56

@Tuco Список содержит пустую строку ...

user10218123 27.02.2019 19:57

@eVolve Да, я выбрал метод POST в Postman и НЕТ, я ничего не вижу, мой объект emp равен NULL

user10218123 27.02.2019 19:58

Ну, не могли бы вы опубликовать в этом посте свой почтовый запрос от почтальона? :) Я имею в виду сырой текст, с заголовками и всем остальным

The One 27.02.2019 19:59

@Tuco Хорошо, я только что добавил это! :)

user10218123 27.02.2019 20:02

В том, что вы делаете, нет ничего плохого!

Amir Molaei 27.02.2019 20:14

Не могли бы вы добавить атрибут [DataContract] в свой класс Employee?

The One 27.02.2019 21:43

@Tuco К сожалению, этого не было в коде, который я разместил, но я его написал!

user10218123 27.02.2019 21:58

@Tuco Я обновил свой пост, я обнаружил, что мой объект был нулевым

user10218123 27.02.2019 23:39

Вы можете поделиться своим решением с github или где-нибудь, чтобы проверить его?

Hien Nguyen 28.02.2019 14:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
21
112
2

Ответы 2

Убедитесь, что вы отправляете заголовок 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, но он тоже не работает.

user10218123 27.02.2019 21:05

Другие вопросы по теме