Объекты 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)...
Документы