ASP.NET Core中两种Ajax提交表单方式为何一有效一无效?
问题原因解析
核心差异在于请求的Content-Type与提交数据格式是否匹配,以及数据序列化方式的不同:
1. $.post的工作逻辑
$.post是jQuery封装的简化版Ajax,默认的Content-Type是application/x-www-form-urlencoded; charset=UTF-8——这和HTML表单原生提交的格式完全一致。
当你传入一个JavaScript对象作为数据时,它会自动把对象转成key1=value1&key2=value2的键值对格式,ASP.NET Core的模型绑定器可以直接解析这种格式,所以能正确填充LenderNotificationEvent模型。
示例代码:
// $.post自动处理数据格式和Content-Type $.post('/Controller/UpdateNotification', { Id: 1, Message: 'test' }, function(response) { // 处理响应 });
2. $.ajax设置JSON Content-Type的问题
你手动设置了contentType: "application/json; charset=utf-8",但如果没有将提交的数据序列化为JSON字符串,请求体里的内容依然是表单格式的键值对,和你声明的Content-Type不匹配。
ASP.NET Core的模型绑定器会根据Content-Type来选择解析方式:当看到application/json时,它会尝试用JSON解析器去解析请求体,但实际内容是表单格式,解析失败后模型就会为空。
正确的做法是用JSON.stringify()把JavaScript对象转成JSON字符串:
$.ajax({ url: '/Controller/UpdateNotification', type: 'POST', contentType: 'application/json; charset=utf-8', // 必须序列化数据为JSON字符串 data: JSON.stringify({ Id: 1, Message: 'test' }), success: function(response) { // 处理响应 } });
总结
- $.post:默认Content-Type匹配表单格式,自动序列化数据,模型绑定成功。
- 错误的$.ajax:Content-Type声明为JSON,但数据还是表单格式,格式不匹配导致绑定失败;修正后序列化数据为JSON字符串,就能正确绑定模型。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

