Asp.net Core 2 API POST对象是NULL吗?

我有一个带有一些测试function的.net Core 2 API设置。 (Visual Studio 2017)

使用postman我用一个原始数据发布到该方法的post,但模型只是空白? 为什么?

// 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; } } 

在此处输入图像描述

在此处输入图像描述

您需要在模型上包含[FromBody ]属性:

 [FromBody] MyTestModel model 

有关更多信息,请参阅Andrew Lock的post :

为了在ASP.NET Core中正确绑定JSON,您必须修改操作以在参数上包含属性[FromBody] 。 这告诉框架使用请求的内容类型头来决定使用哪个配置的IInputFormatters进行模型绑定。

正如@anserk在评论中所指出的,这也需要将Content-Type标头设置为application/json

要向接受的答案添加更多信息:

在不使用属性的情况下,有三个源自动绑定参数:

表单值:这些是使用POST方法在HTTP请求中的表单值。 (包括jQuery POST请求)。

路由值:路由提供的路由值集

查询字符串:URI的查询字符串部分。

请注意, Body不是其中之一(虽然我认为它应该是)。

因此,如果您需要从正文绑定值,则必须使用属性绑定属性。

这让我在昨天绊倒了,因为我假设Body的参数会自动绑定。

第二个要点是只有一个参数可以绑定到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)... 

文件