Web API POST请求中数值属性为何仅接收到默认值而非传入值?
嘿,我碰到过好几个和你一模一样的问题,大概率是下面这几个原因之一,咱们一步步排查:
属性名大小写不匹配
虽说ASP.NET Core默认的JSON序列化器(System.Text.Json)是大小写不敏感的,但如果你手动改过配置(比如把PropertyNameCaseInsensitive设成了false),那前端传的pageSize和后端模型里的PageSize就会匹配失败。你可以去Startup/Program.cs里看看有没有类似这样的代码:builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = false; });要是有的话,要么把这个值改回
true,要么让前端统一用和后端一致的大小写传参。前端传的是字符串而非数值类型
有时候前端会不小心把数值当成字符串传(比如写成"pageSize": "20"而不是"pageSize": 20),如果后端模型里的PageSize是int类型,模型绑定就会失败,只能拿到默认值(null或者0)。你可以去Chrome的Network面板里看请求体的Raw内容,确认pageSize是纯数值而不是带引号的字符串。要是前端传的是字符串,要么让他们改成数值类型,要么后端把属性改成string再转成int,前者肯定更规范。检查模型属性的可访问性
确保你的criteria模型里的数值属性都是public的,要是设成了private或者protected,模型绑定根本拿不到值。比如正确的写法应该是:public class Criteria { public string Sort { get; set; } public int? Offset { get; set; } public int PageSize { get; set; } }排查自定义绑定逻辑的干扰
如果你的项目里加了自定义的模型绑定器、Action过滤器或者中间件,说不定这些代码干扰了数值属性的绑定。可以先暂时注释掉这些自定义代码,测试下数值属性能不能正常接收,要是可以的话再逐步排查是哪段代码出了问题。查看模型绑定的详细日志
你可以开启ASP.NET Core的模型绑定日志,看看具体的绑定失败原因。在appsettings.json里加这段配置:{ "Logging": { "LogLevel": { "Microsoft.AspNetCore.Mvc.ModelBinding": "Debug" } } }然后运行项目,看控制台或者日志文件里的Debug信息,里面会详细告诉你哪个属性绑定失败、原因是什么。
对了,你说URL参数DealKey正常工作,这是因为URL参数的绑定逻辑和请求体的JSON绑定逻辑不太一样,所以问题大概率出在请求体的JSON绑定环节,和URL参数的绑定没关系。
内容的提问来源于stack exchange,提问作者adam0101

