You need to enable JavaScript to run this app. AJAX传递JSON数据至MVC Controller未触发调用问题求助
优惠活动
大模型
产品
解决方案
定价
更多

AJAX传递JSON数据至MVC Controller未触发调用问题求助

问题排查及解决方案

核心问题原因

1. 参数绑定不匹配

你通过AJAX发送的是包含title和chunks两个属性的JSON整体对象,但Controller端的Action定义了两个独立接收参数,且未配置[FromBody]特性,MVC默认无法从JSON请求体中匹配到对应参数,会直接拒绝请求。

2. 路径解析失效(常见场景)

如果你的AJAX代码写在独立的.js文件中,@Url.Action是Razor服务端语法,不会被服务器解析,会直接作为纯字符串拼接为请求路径,导致404错误。

3. Action请求方式限制

如果Action未添加[HttpPost]特性,MVC默认仅允许GET请求访问,POST请求会被拦截。


修复步骤

方案1:保留JSON传参(推荐)

第一步:新增接收参数的ViewModel

public class ContentRequest
{
    public string title { get; set; }
    public List<Chunk> chunks { get; set; }
}

第二步:修改Controller Action

// 新增HttpPost特性 + FromBody参数绑定
[HttpPost]
public async Task<JsonResult> GetContentModelForReaderAsync([FromBody] ContentRequest request)
{
    // 原有逻辑改为从request中取title和chunks即可
    var title = request.title;
    var chunks = request.chunks;
    // ... 其余逻辑不变
}

第三步:检查AJAX路径

如果JS写在独立.js文件中,将url改为直接写路径即可:

url: "/Home/GetContentModelForReaderAsync",

方案2:改为表单格式传参(无需新建ViewModel)

直接修改AJAX配置,去掉JSON序列化和对应配置:

$.ajax({
    type: 'POST',
    url: "/Home/GetContentModelForReaderAsync",
    // 删掉contentType: 'application/json'配置
    data: content, // 直接传JS对象,不要序列化
    dataType: 'json',
    traditional: true,
    // success、error逻辑不变
});

Controller端仅需要补充[HttpPost]特性即可:

[HttpPost]
public async Task<JsonResult> GetContentModelForReaderAsync(List<Chunk> chunks, string title)
{
    // 原有逻辑不变
}

快速验证方法

按F12打开浏览器开发者工具,切换到「网络」标签,触发请求后查看请求状态:

  • 状态码404:请求路径错误,检查URL拼写、路由配置
  • 状态码400:参数绑定失败,按上述方案调整参数规则即可

内容的提问来源于stack exchange,提问作者Cristobal BL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 21:18:01