.Net 核心模型绑定 JSON Post 到 Web API
.Net Core Model Binding JSON Post To Web API
刚开始使用 .NET Core 的新项目。添加了我的 Web API 控制器和相关方法。我使用 Postman 创建了一个 JSON 对象并将其发布到我的控制器方法中。请记住,JSON 对象与控制器方法中的对象参数完全匹配。
在调试模式下我可以看到对象,它不是空的,属性在那里,但是属性值默认为其代表类型,0
for int
,等等
我以前从未见过这种行为……所以我采用了完全相同的代码和对象,并在带有 Web API 2 控制器的 MVC 项目中进行了复制,并且它运行良好。
我错过了什么,我不能 POST JSON 和 .NET Core 中的模型绑定吗?
阅读这篇文章似乎我不能,除非我以形式 POST 或查询字符串变量发送,顺便说一句工作正常。
https://lbadri.wordpress.com/2014/11/23/web-api-model-binding-in-asp-net-mvc-6-asp-net-5/
JSON:
{
"id": "4",
"userId": "3"
"dateOfTest": "7/13/2017"
}
方法:
[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test(Class1 data)
{
return Ok();
}
注意:如果您使用的是aspnet core 3.0,可以找到解决方案here。对于其他版本,请继续阅读。
您需要使用 FromBody
属性将您的参数标记为来自正文,如下所示:
[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test([FromBody] Class1 data)
{
return Ok();
}
您需要确保使用 application/json
作为 Postman 的内容类型:
导致:
确保您的 属性 二传手也是 public:
public class Person
{
public String Name;
public Int32 Age;
}
我已经为这个问题苦苦挣扎了几个小时,none 的现有解决方案对我有用,但结果是我没有 public 传入的 class 无参数构造函数实例。在这种情况下,Class1
只有受保护的构造函数,无论如何参数始终为 null。希望对大家有帮助。
我也为此苦苦挣扎,我想我会分享一个对我来说必要的项目,而不是在接受的答案中,我需要添加 {get;设置;}到我的 class 中的每个属性,如下所示:
public class LogString{
public string val {get; set;}
public string data {get; set;}
}
其余相同:
[HttpPost]
public void Post([FromBody] LogString message)
{
Console.WriteLine(message.val);
}
添加后开始工作。
我有一个 ASP.Net Core 3.1 应用程序,对我来说,none 这些解决方案有效。在找到文档之前,我失去了几根头发(和几个小时的工作)
https://docs.microsoft.com/en-us/aspnet/core/web-api/jsonpatch?view=aspnetcore-3.1
简而言之:
- 安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet 包。
更新项目的 Startup.ConfigureServices 方法以调用 AddNewtonsoftJson。例如:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages()
.AddNewtonsoftJson();//this is important
}
就是这样!我不需要 [FromBody] 属性。
如果它不起作用,请验证您的模型的属性是否具有 setter(例如 public string Message { get; set; }
)。 别忘了 setter.
考虑 Properties 而不是绑定对象上的 Fields
在 .NET 5 上,我必须将 {get; set;}
添加到我的 public 字段以将它们转换为属性以填充它们。
要么 .NET 5 中的模型绑定器无法处理字段,要么您必须执行一些特殊操作才能填充字段。我不知道哪个。将我所有的字段转换为属性花了几分钟,所以我不会花时间试图弄清楚如何配置它以使用字段。
注意:如果您对请求对象有这个问题,您可能也会对响应对象有同样的问题。
如果其他人遇到这个问题并且像我一样习惯使用 .Net Framework MVC,您可能正在创建类似于此的 JSON 对象 -
this.http.post<Stock>("/api/Stock2", { Stock: this.SelectedStock }, this.httpOptions)
然后期望它绑定到 'Stock'
[HttpPost("Stock2")]
public JsonResult Stock2(ConsolidatedStock Stock) {
return this.Json(1);
}
这将不再适用于 .net 核心,您需要更改构建 JSON -
的方式
this.http.post<Stock>("/api/Stock2", this.SelectedStock, this.httpOptions)
如果你想 post 多个对象,你需要创建一个新模型来保存这些对象,例如
public class StockViewModel {
public ConsolidatedStock Stock { get; set; }
}
刚开始使用 .NET Core 的新项目。添加了我的 Web API 控制器和相关方法。我使用 Postman 创建了一个 JSON 对象并将其发布到我的控制器方法中。请记住,JSON 对象与控制器方法中的对象参数完全匹配。
在调试模式下我可以看到对象,它不是空的,属性在那里,但是属性值默认为其代表类型,0
for int
,等等
我以前从未见过这种行为……所以我采用了完全相同的代码和对象,并在带有 Web API 2 控制器的 MVC 项目中进行了复制,并且它运行良好。
我错过了什么,我不能 POST JSON 和 .NET Core 中的模型绑定吗?
阅读这篇文章似乎我不能,除非我以形式 POST 或查询字符串变量发送,顺便说一句工作正常。
https://lbadri.wordpress.com/2014/11/23/web-api-model-binding-in-asp-net-mvc-6-asp-net-5/
JSON:
{
"id": "4",
"userId": "3"
"dateOfTest": "7/13/2017"
}
方法:
[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test(Class1 data)
{
return Ok();
}
注意:如果您使用的是aspnet core 3.0,可以找到解决方案here。对于其他版本,请继续阅读。
您需要使用 FromBody
属性将您的参数标记为来自正文,如下所示:
[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test([FromBody] Class1 data)
{
return Ok();
}
您需要确保使用 application/json
作为 Postman 的内容类型:
导致:
确保您的 属性 二传手也是 public:
public class Person
{
public String Name;
public Int32 Age;
}
我已经为这个问题苦苦挣扎了几个小时,none 的现有解决方案对我有用,但结果是我没有 public 传入的 class 无参数构造函数实例。在这种情况下,Class1
只有受保护的构造函数,无论如何参数始终为 null。希望对大家有帮助。
我也为此苦苦挣扎,我想我会分享一个对我来说必要的项目,而不是在接受的答案中,我需要添加 {get;设置;}到我的 class 中的每个属性,如下所示:
public class LogString{
public string val {get; set;}
public string data {get; set;}
}
其余相同:
[HttpPost]
public void Post([FromBody] LogString message)
{
Console.WriteLine(message.val);
}
添加后开始工作。
我有一个 ASP.Net Core 3.1 应用程序,对我来说,none 这些解决方案有效。在找到文档之前,我失去了几根头发(和几个小时的工作) https://docs.microsoft.com/en-us/aspnet/core/web-api/jsonpatch?view=aspnetcore-3.1
简而言之:
- 安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet 包。
更新项目的 Startup.ConfigureServices 方法以调用 AddNewtonsoftJson。例如:
public void ConfigureServices(IServiceCollection services) { services.AddRazorPages() .AddNewtonsoftJson();//this is important }
就是这样!我不需要 [FromBody] 属性。
如果它不起作用,请验证您的模型的属性是否具有 setter(例如 public string Message { get; set; }
)。 别忘了 setter.
考虑 Properties 而不是绑定对象上的 Fields
在 .NET 5 上,我必须将 {get; set;}
添加到我的 public 字段以将它们转换为属性以填充它们。
要么 .NET 5 中的模型绑定器无法处理字段,要么您必须执行一些特殊操作才能填充字段。我不知道哪个。将我所有的字段转换为属性花了几分钟,所以我不会花时间试图弄清楚如何配置它以使用字段。
注意:如果您对请求对象有这个问题,您可能也会对响应对象有同样的问题。
如果其他人遇到这个问题并且像我一样习惯使用 .Net Framework MVC,您可能正在创建类似于此的 JSON 对象 -
this.http.post<Stock>("/api/Stock2", { Stock: this.SelectedStock }, this.httpOptions)
然后期望它绑定到 'Stock'
[HttpPost("Stock2")]
public JsonResult Stock2(ConsolidatedStock Stock) {
return this.Json(1);
}
这将不再适用于 .net 核心,您需要更改构建 JSON -
的方式 this.http.post<Stock>("/api/Stock2", this.SelectedStock, this.httpOptions)
如果你想 post 多个对象,你需要创建一个新模型来保存这些对象,例如
public class StockViewModel {
public ConsolidatedStock Stock { get; set; }
}