Объекты POST для Asp.net Core 2 являются NULL?

У меня есть настройка .net Core 2 API с некоторой тестовой функцией. (Visual Studio 2017)

Использование почтальона Я делаю сообщение с необработанными данными для этого метода, но модель просто пустая? Почему?

        // POST api/Product/test
        [HttpPost]
        [Route("test")]
        public object test(MyTestModel model)
        {
            try
            {
                var a = model.SomeTestParam;

                return Ok("Yey");
            }
            catch (Exception ex)
            {
                return BadRequest(new { message = ex.Message });
            }
        }

        public class MyTestModel
        {
            public int SomeTestParam { get; set; }

        }

введите описание изображения здесь

введите описание изображения здесь

Ответ 1

Вам нужно включить атрибут [FromBody] в модель:

[FromBody] MyTestModel model

Подробнее см. Andrew Lock post:

Чтобы привязать JSON правильно в ядре ASP.NET, вы должны изменить свое действие, чтобы включить атрибут [FromBody] в параметр. Это сообщает структуре использовать заголовок типа содержимого запроса, чтобы решить, какой из настроенных IInputFormatters использовать для привязки к модели.

Как отмечено @anserk в комментариях, для этого также требуется, чтобы заголовок Content-Type был установлен на application/json.

Ответ 2

Чтобы добавить дополнительную информацию к принятому ответу:

Существует три источника, из которых параметры связаны автоматически без использования атрибута:

Значения форм: это значения форм, которые входят в HTTP-запрос, используя метод POST. (включая запросы POST jQuery).

Значения маршрута: набор значений маршрута, предоставляемых маршрутизацией

Строки запроса: часть строки запроса в URI.

Обратите внимание, что Body НЕ является одним из них (хотя я думаю, что это должно быть).

Итак, если у вас есть значения, которые должны быть привязаны от тела, вы ДОЛЖНЫ использовать атрибут привязки атрибута.

Это помогло мне вчера, когда я предположил, что параметры из тела будут связаны автоматически.

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

В одном действии, украшенном [FromBody], может быть не более одного параметра. Операционная среда ASP.NET Core MVC делегирует ответственность за чтение потока запросов в форматтер. Как только поток запроса считывается для параметра, как правило, невозможно снова прочитать поток запросов для привязки других параметров [FromBody].

Таким образом, если вам нужно больше одного параметра, вам необходимо создать класс Model для их привязки:

public class InputModel{
   public string FirstName{get;set;}
   public string LastName{get;set;}
}

[HttpPost]
public IActionResult test([FromBody]InputModel model)...

Документы