You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:54:23