API控制器[FromBody]无法正确获取数据,数值字段全为0
问题解决方法
核心问题分析
- JSON请求体中数值以字符串类型传递(如
"ID":"1"),但模型字段定义为int/double,默认绑定规则无法自动转换,导致字段取默认值0。 - 若使用ASP.NET Core 3.0+,默认序列化器是
System.Text.Json,但模型中用的是Newtonsoft.Json的[JsonProperty]特性,两者不兼容,导致属性名映射失败。 - 带
"data"嵌套的请求体结构与接收模型不匹配,无法正确绑定。
解决方案
1. 修正JSON请求体的数值类型
将字符串格式的数值改为纯数字,确保类型匹配:
{ "ID": 1, "Temp": 37, "Humidity": 42, "WindSpeed": 12, "SoilMoisture": 14 }
2. 统一序列化特性
根据你使用的序列化框架调整模型特性:
使用System.Text.Json(ASP.NET Core默认)
替换[JsonProperty]为[JsonPropertyName](需引用System.Text.Json.Serialization命名空间):using System.Text.Json.Serialization; public class DataInfo { [JsonPropertyName("ID")] public int JId { get; set; } [JsonPropertyName("Temp")] public double JTemperature { get; set; } [JsonPropertyName("Humidity")] public double JHumidity { get; set; } [JsonPropertyName("WindSpeed")] public double JWindSpd { get; set; } [JsonPropertyName("SoilMoisture")] public double JSM { get; set; } }坚持用Newtonsoft.Json
在项目配置中替换默认序列化器(以.NET 6+为例,在Program.cs中):builder.Services.AddControllers().AddNewtonsoftJson();
3. 处理嵌套请求体(可选)
如果需要支持带"data"嵌套的请求体,需创建包装类并修改控制器:
// 新增包装类 public class DataInfoWrapper { public DataInfo data { get; set; } } // 控制器修改接收参数 [HttpPatch("update")] public async Task<ActionResult<Device>> Update([FromBody] DataInfoWrapper wrapper) { if (wrapper?.data == null) { return BadRequest("invalid request data"); } var data = wrapper.data; // 后续原有逻辑不变 }
4. 添加模型验证排查错误
在控制器中检查ModelState,可以获取具体的绑定错误信息,方便调试:
[HttpPatch("update")] public async Task<ActionResult<Device>> Update([FromBody] DataInfo data) { if (!ModelState.IsValid) { return BadRequest(ModelState); // 返回详细绑定错误 } // 原有逻辑 }
内容的提问来源于stack exchange,提问作者AHartwig99
相关产品推荐
相关产品推荐

