Angular前端传FormGroup至.NET后端,FromBody无法正确捕获Amount值
前端采用Angular框架,后端使用.NET。当前端将FormGroup数据提交至后端接口时,控制器断点处发现通过FromBody绑定的DonationAmount模型中Amount值始终为0,但浏览器开发者工具显示API请求的Payload数据正常。
后端代码如下:
public class DonationAmount { public int Amount { get; set; } } [Route("create-checkout-session")] [ApiController] public class CheckoutApiController : Controller { [HttpPost] public ActionResult Create([FromBody] DonationAmount donationAmount) { try { ... } catch (StripeException ex) { ... } catch (Exception ex) { ... } } }
已尝试谷歌搜索、查看YouTube教程、咨询ChatGPT,也匹配了JSON数据与模型属性的大小写,但问题仍未解决,求问题原因及解决办法。
1. 请求Content-Type不匹配
Angular的HttpClient默认发送application/json类型请求,但如果手动修改了请求头为其他类型(比如application/x-www-form-urlencoded),.NET的FromBody模型绑定会失效。检查前端请求代码,确保Content-Type正确:
// 正确示例 this.http.post('/create-checkout-session', formGroup.value, { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) });
2. JSON序列化大小写配置问题
.NET默认的System.Text.Json序列化是区分大小写的,若前端发送的是小写amount,而模型属性是大写Amount,绑定会失败并赋值默认值0。解决方式二选一:
- 前端修改请求Payload的键为
Amount(首字母大写) - 后端给模型属性添加特性指定对应JSON键,或全局配置不区分大小写:
// 单个属性配置 public class DonationAmount { [JsonPropertyName("amount")] public int Amount { get; set; } } // 全局配置(Program.cs/Startup.cs) builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; });
3. 数据类型不匹配
检查前端Payload中Amount的值是否为数字类型。如果前端传的是字符串(比如"100"),而模型属性是int,转换失败会导致值为0。确认Payload里的Amount是数字而非字符串。
4. 请求路由不匹配
确认前端请求的URL和后端路由完全一致,比如是否遗漏了前缀(比如/api/create-checkout-session)。路由不匹配时可能进入错误的方法,导致模型未正确绑定。
5. JSON结构不匹配
如果前端发送的是嵌套结构(比如{ donation: { amount: 100 } }),而非直接的{ amount: 100 },模型绑定会找不到对应字段,最终赋值默认值0。仔细核对Payload的结构是否和DonationAmount模型完全对应。
内容的提问来源于stack exchange,提问作者Andrew Edgin

