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)...
文件