MVC Core 2中Ajax POST请求报Bad Request问题求助
看起来你在从传统ASPX迁移到ASP.NET Core 2的过程中遇到了POST请求的坑,我帮你梳理几个关键问题点,应该能解决这个Bad Request的问题:
1. 先修复Ajax请求里的data参数(最可能的元凶)
你当前的Ajax代码里写了data: JSON.stringify()——这个写法会生成字符串"undefined",而ASP.NET Core对application/json类型的请求体校验很严格,"undefined"并不是合法的JSON格式,直接就会返回400 Bad Request。
如果你的接口不需要传递任何参数,要么直接去掉data属性,要么传入空对象转成合法的JSON:
function get_Data() { $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "/Home/Get_Index_Values", data: JSON.stringify({}), // 空对象生成合法的{},避免解析错误 dataType: "json" }) .done(function(response) { // 注意是小写的done,不是你写的Done // 这里写成功后的处理逻辑 }) .fail(function(ts){ // 建议打印responseText看具体错误详情,比response更有用 alert(ts.responseText); }) }
2. 确保控制器方法的配置正确
即使不需要参数,也要让ASP.NET Core能正确识别这是一个POST接口:
- 保留
[HttpPost]特性,同时明确返回JsonResult(和之前GET的签名保持一致更清晰):
[HttpPost] public JsonResult Get_Index_Values() { // 你的业务逻辑代码 return Json(/* 这里返回要给前端的数据 */); }
- 如果你的项目用了属性路由,记得给控制器或方法加上路由特性,比如在HomeController上加上:
[Route("[controller]/[action]")] public class HomeController : Controller { [HttpPost] public JsonResult Get_Index_Values() { // ... } }
这样就能确保/Home/Get_Index_Values这个URL能正确匹配到方法。
3. 检查Ajax的回调方法大小写
你代码里写的.Done({})是错误的——jQuery的Ajax成功回调是小写的.done(),虽然这个不是Bad Request的直接原因,但会导致成功回调无法执行,后续调试也会混乱,赶紧改掉。
4. 查看具体的错误详情
建议打开浏览器的开发者工具->网络面板,找到这个POST请求,查看它的响应内容——ASP.NET Core在开发环境下会返回非常详细的错误信息(比如JSON解析失败、路由不匹配等),这能帮你快速定位问题根源。
5. 验证路由是否真的匹配
如果上面的步骤都试了还是不行,可以在控制器方法里打个断点,看请求是否能到达:
- 如果断点没命中,说明路由不匹配,检查Startup.cs里的路由配置,或者用
app.UseDeveloperExceptionPage();(开发环境下)查看路由匹配的详细日志。
本质上,这个问题最可能的原因就是无效的JSON请求体导致ASP.NET Core的模型绑定失败——旧的ASPX对这种情况的处理比较宽松,但Core版本的校验更严格,这也是迁移时容易踩的坑。
内容的提问来源于stack exchange,提问作者Chris

