.Net核心模型绑定JSON Post到Web API

时间:2017-07-13 16:35:06

标签: c# asp.net-core asp.net-web-api2 model-binding asp.net-core-webapi

刚刚使用.NET Core启动了一个新项目。添加了我的Web API控制器和相关方法。使用Postman我创建了一个JSON对象并将其发布到我的控制器方法。请记住,JSON对象与控制器方法中的Object参数完全匹配。

在调试模式下,我可以看到对象,它不是null,属性在那里,但是prop值默认为其代表类型,0int等等。

我之前从未见过这种行为......所以我使用了完全相同的代码和对象,并在一个带有Web API 2控制器的MVC项目中进行了复制,它运行良好。

我缺少什么,我不能在.NET Core中POST JSON和模型绑定吗?

阅读这篇文章似乎我不能,除非我发送表格POST或querystring vars顺便说一句。

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();
}

5 个答案:

答案 0 :(得分:18)

您需要使用FromBody属性将参数标记为来自正文:

[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test([FromBody] Class1 data)
{
    return Ok();
}

您需要确保使用application / json作为Postman的内容类型:

Postman application/json

导致:

json POST action

确保您的酒店设置者也是公开的:

public class Person
{
    public String Name;
    public Int32 Age;
}

答案 1 :(得分:3)

我有一个 ASP.Net Core 3.1 应用程序,对我来说,这些解决方案都没有用。在找到文档之前,我掉了几根头发(和工作时间) https://docs.microsoft.com/en-us/aspnet/core/web-api/jsonpatch?view=aspnetcore-3.1

简而言之:

  1. 安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet软件包。
  2. 更新项目的Startup.ConfigureServices方法以调用 AddNewtonsoftJson 。例如:

    public void ConfigureServices(IServiceCollection services) { services.AddRazorPages() .AddNewtonsoftJson();//this is important }

就是这样!我不需要 [FromBody] 属性。

如果它不起作用,请验证模型的属性是否具有设置器(例如public string Message { get; set; })。 别忘了二传手。

答案 2 :(得分:0)

我已经为这个问题苦苦挣扎了好几个小时,没有一个现有的解决方案对我有用,但是事实证明,我没有传入实例类的公共无参数构造函数。在这种情况下,Class1仅具有受保护的构造函数,并且无论如何,参数始终为null。希望对别人有帮助。

答案 3 :(得分:0)

我也在为此而苦苦挣扎,以为我会分享一个对我来说必要的项目,而不是在公认的答案中,我需要添加{get; set;}设置为类中的每个属性,如下所示:

    public class LogString{
        public string val {get; set;}
        public string data {get; set;}
    }

其余相同:

        [HttpPost]
        public void Post([FromBody] LogString message)
        {      
            Console.WriteLine(message.val);
        }

添加后,它开始工作。

答案 4 :(得分:0)

如果其他人遇到这个问题并且像我一样习惯使用 .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 core,您需要更改构建 JSON 的方式 -

 this.http.post<Stock>("/api/Stock2", this.SelectedStock, this.httpOptions)

如果您想发布多个对象,则需要创建一个新模型来保存这些对象,例如

public class StockViewModel {
    public ConsolidatedStock Stock { get; set; }
}