我有一个带有一些测试功能的.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; }
}
答案 0 :(得分:25)
您需要在模型中包含[FromBody
]属性:
[FromBody] MyTestModel model
有关详细信息,请参阅Andrew Lock的post:
为了在ASP.NET Core中正确绑定JSON,您必须修改操作以在参数上包含属性
[FromBody]
。这告诉框架使用请求的内容类型头来决定使用哪个配置的IInputFormatters进行模型绑定。
正如@anserk在评论中所指出的,这也需要将Content-Type
标头设置为application/json
。
答案 1 :(得分:3)
要向接受的答案添加更多信息:
有三个来源,参数在不使用属性的情况下自动绑定:
表单值:这些是使用HTTP请求中的表单值 POST方法。 (包括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)...
答案 2 :(得分:0)
我处理了几个小时。该问题源于几个原因。让我们考虑一下请求是Reactjs(javascript),后端(API)是Asp .Net Core。
在请求中,必须在标题Content-Type中设置:
Axios({
method: 'post',
headers: { 'Content-Type': 'application/json'},
url: 'https://localhost:44346/Order/Order/GiveOrder',
data: order,
}).then(function (response) {
console.log(response);
});
并且在后端(Asp .net核心API)中,您必须进行一些设置:
1。在启动-> ConfigureServices :
#region Allow-Orgin
services.AddCors(c =>
{
c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
});
#endregion
2。在启动->在app.UseMvc()之前配置:
app.UseCors(builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
3。在控制器中先执行以下操作:
[EnableCors("AllowOrigin")]
答案 3 :(得分:0)
就我而言,我有 { get;放;在我的 .cs 模型中丢失,这导致在 POST 时所有成员都为空的对象。