C# ASP.NET Core 2.2 API接收Angular POST参数为null如何解决
问题原因
最主要的问题出在你后端定义的ShippingRateModel模型上:C#类的成员如果没有显式声明访问修饰符,默认是**私有(private)**的,ASP.NET Core的模型绑定系统在反序列化请求体的JSON内容时,只能读写公共(public)属性完成赋值,私有属性无法被访问到,所以即使结构完全匹配,反序列化出来的对象所有属性都是默认值,甚至整个对象为null。
其次你没有给接口参数显式加[FromBody]特性,即使你说之前加过没效果,那是因为第一个问题没解决,两个问题叠加才导致参数始终为null。
解决步骤
1. 修改后端模型属性为公共属性
将后端ShippingRateModel的所有属性前加上public修饰符:
namespace Server.Models { public class ShippingRateModel { public float WeightKg { get; set; } public string OriginPostalCode { get; set; } public string DestPostalCode { get; set; } } }
2. 给接口参数加上[FromBody]特性
显式声明框架从POST请求的Body中读取JSON内容反序列化为参数对象:
[HttpPost] public void GetCanadaPostRates([FromBody] ShippingRateModel info) { // 接口命中后info就能正常获取到前端传的参数 // 业务逻辑 }
额外排查点
如果完成上述修改后还是有问题,可以检查以下配置:
- 确认请求头的
Content-Type值为application/json,Angular的HttpClient默认传递对象时会自动携带该请求头,如果你自定义过请求配置需要确认没有覆盖该配置 - 如果你项目中配置了JSON序列化强制使用驼峰命名规则,要么调整前端传递的参数key为驼峰格式(如
weightKg而不是WeightKg),要么给后端属性加上序列化别名特性:使用Newtonsoft.Json的话加[JsonProperty("weightKg")],使用System.Text.Json的话加[JsonPropertyName("weightKg")] - 确认前端传递的参数值类型和后端匹配,比如
WeightKg不要传递字符串类型的数值,避免类型不匹配导致反序列化失败
内容的提问来源于stack exchange,提问作者nightwolf555
相关产品推荐
相关产品推荐

