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

Mik*_*son 11 c# model-binding asp.net-web-api2 asp.net-core asp.net-core-webapi

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

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

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

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

阅读这篇文章似乎我不能,除非我发送形式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"
}
Run Code Online (Sandbox Code Playgroud)

方法:

[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test(Class1 data)
{
    return Ok();
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 20

您需要使用FromBody属性将参数标记为来自正文,如下所示:

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

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

邮递员申请/ json

导致:

json POST动作

确保您的属性设置器也是公共的:

public class Person
{
    public String Name;
    public Int32 Age;
}
Run Code Online (Sandbox Code Playgroud)


ede*_*bin 7

我也在为此苦苦挣扎,并认为我会分享一项对我来说必不可少的项目,而不是在已接受的答案中,我需要添加 {get; 设置;} 到我班级中的每个属性,如下所示:

    public class LogString{
        public string val {get; set;}
        public string data {get; set;}
    }
Run Code Online (Sandbox Code Playgroud)

其余的都是一样的:

        [HttpPost]
        public void Post([FromBody] LogString message)
        {      
            Console.WriteLine(message.val);
        }
Run Code Online (Sandbox Code Playgroud)

添加后它开始工作。

  • 这是唯一对我有用的事情。我在文档中没有看到任何地方说您需要使用属性而不是成员变量!这令人沮丧。 (2认同)

Dan*_*iel 6

我有一个ASP.Net Core 3.1应用程序,对我来说,这些解决方案都不起作用。我失去了几根头发(和几个小时的工作),直到我找到文档 https://learn.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
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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