ASP.NET Core中Ajax POST请求失效问题求助
咱们先来拆解一下你遇到的问题:手动访问接口能拿到JSON,但AJAX POST请求却触发错误,核心原因出在后端返回的内容格式和AJAX的期望不匹配,还有一些细节需要调整。
具体问题分析
后端返回的是HTML视图而非纯JSON
你的GetAllAction最后返回的是View("Empty", em),这意味着ASP.NET Core会渲染Empty视图,把em.Message的JSON字符串嵌入到HTML里返回给客户端。此时响应的Content-Type是text/html,而不是AJAX请求指定的application/json。当AJAX尝试把HTML内容解析成JSON时,自然会失败,触发error回调。AJAX的
contentType设置冗余(非核心报错原因)
你设置了contentType: "application/json; charset=utf-8",但后端Action没有接收任何参数,这个设置其实没必要——因为没有JSON格式的请求体需要传递。不过这不是导致报错的直接原因,但可以优化。
修复方案
方案1:修改后端Action,直接返回JSON结果
把原来返回View的逻辑改成返回JsonResult,让ASP.NET Core直接输出JSON格式的响应,同时自动设置正确的Content-Type:
[HttpPost] public IActionResult GetAll() { List<string> list = new List<string>(); // 用Path.Combine拼接路径更安全,避免分隔符问题 string uploadPath = Path.Combine(_hostingEnvironment.WebRootPath, "Uploads", "Images"); string[] files = Directory.GetFiles(uploadPath); foreach (string file in files) list.Add(Path.GetFileName(file)); // 直接返回JSON数组,ASP.NET Core自动处理序列化和响应头 return Json(list); }
方案2:调整AJAX请求(配合方案1优化)
既然后端现在返回纯JSON了,AJAX请求可以简化,同时优化成功回调的提示逻辑(直接alert数组会显示[object Object],需要转成字符串):
$(function () { $.ajax({ type: "POST", url: "/Gallery/GetAll", dataType: "json", success: function (data) { alert(JSON.stringify(data)); }, error: function (xhr) { // 增加错误详情,方便后续调试 alert("ERROR: " + xhr.responseText); } }); });
为什么手动访问看起来正常?
你手动访问时,其实是拿到了渲染后的HTML页面,页面里刚好显示了JSON字符串,所以你误以为是返回了纯JSON。但AJAX请求会严格检查响应的Content-Type和内容格式,因此触发了错误。
内容的提问来源于stack exchange,提问作者Aleksa Ristic

