繁体   English   中英

.Net Core 模型绑定 JSON Post 到 Web API

[英].Net Core Model Binding JSON Post To Web API

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

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

我以前从未见过这种行为……所以我采用了完全相同的代码和对象,并在带有 Web API 2 控制器的 MVC 项目中进行了复制,并且效果很好。

我错过了什么,我不能在 .NET Core 中发布 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"
}

方法:

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

注意:如果您使用的是 aspnet core 3.0,可以在此处找到解决方案。 对于其他版本,请继续阅读。

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

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

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

邮递员申请/json

导致:

json POST 操作

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

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

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

    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应用程序,对我来说,这些解决方案都不起作用。 在找到文档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; } )。 不要忘记二传手。

我一直在为这个问题苦苦挣扎了几个小时,但没有一个现有的解决方案对我有用,但结果我没有用于传入实例类的公共无参数构造函数。 在这种情况下, Class1只有受保护的构造函数,并且无论如何参数始终为 null。 希望它可以帮助某人。

考虑绑定对象上的属性而不是字段

在 .NET 5 上,我必须添加 {get; set;} 到我的公共字段,将它们转换为属性以填充它们。

.NET 5 中的模型绑定器无法处理字段,或者您必须做一些特殊的事情来填充它们。 我不知道是哪个。 将我的所有字段转换为属性花了几分钟,所以我不会花时间试图弄清楚如何配置它以处理字段。

注意:如果您在使用请求对象时遇到此问题,那么您在使用响应对象时可能也会遇到同样的问题。

如果其他人遇到这个问题,并且像我一样习惯于使用 .Net Framework MVC,您可能正在创建与此类似的 JSON 对象 -

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

然后期望它绑定到“股票”

[HttpPost("Stock2")]
    public JsonResult Stock2(ConsolidatedStock Stock) {
        return this.Json(1);
    }

这将不再适用于 .net 核心,您需要更改构建 JSON 的方式 -

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM