首次使用.NET Core时无法通过Ajax POST请求调用控制器Action的问题求助
刚上手.NET Core遇到这种404问题太正常了,毕竟它和传统ASP.NET MVC在路由配置上有不少细节差异,我帮你梳理几个最可能的原因和解决办法:
1. 端点路由配置缺失(最常见原因)
.NET Core 3.0+默认使用端点路由,如果你的项目里没正确配置控制器路由,就会导致Action找不到。
检查你的Program.cs(.NET 6+)或者Startup.cs(.NET 5及更早):
- 首先要确保已经添加了控制器服务:
// Program.cs builder.Services.AddControllers(); - 然后在中间件管道里启用控制器路由:
// Program.cs app.UseRouting(); // 两种方式二选一: app.MapControllers(); // 匹配属性路由或默认路由的控制器 // 或者指定默认路由模板 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}" );
2. 路由大小写敏感性坑
.NET Core路由默认是大小写敏感的(和传统MVC不一样)!你的Action方法名是mapContact(小写m),但如果用默认路由,要确保Ajax请求的URL大小写完全匹配:
var url = "/MapObjects/mapContact"; // 这里的mapContact要和方法名大小写一致
如果你的Action是PascalCase命名(比如MapContact),那URL就要改成/MapObjects/MapContact。
3. 用属性路由明确路径(最稳妥的方式)
如果不想纠结默认路由的规则,直接给Action加上属性路由,明确指定访问路径:
namespace myName.Controllers { public class MapObjectsController : Controller { [HttpPost] [Route("MapObjects/mapContact")] // 明确路由路径 public JsonResult mapContact() { Account account = new Account(); return Json(account); } } }
也可以给控制器加路由前缀,简化Action的路由:
[Route("[controller]")] // 前缀为控制器名 public class MapObjectsController : Controller { [HttpPost("[action]")] // 路径为控制器名/方法名 public JsonResult mapContact() { Account account = new Account(); return Json(account); } }
4. 静态HTML页面的路径问题
你是在普通HTML页面发起Ajax请求,不能用Razor的@Url.Action(这个是服务器端渲染语法,只有Razor视图能解析)。如果你的应用部署在子目录下,建议用window.location.origin拼接绝对路径,避免根路径错误:
var url = window.location.origin + "/MapObjects/mapContact";
5. 控制器扫描范围问题
确保你的MapObjectsController在Controllers命名空间下(或者已配置的扫描范围内),.NET Core默认只会扫描项目根目录下Controllers命名空间里的控制器,如果你的控制器在其他命名空间,需要在添加服务时指定:
builder.Services.AddControllers() .AddApplicationPart(typeof(MapObjectsController).Assembly);
按上面的步骤排查,大概率能解决你的404问题。如果还是不行,可以看看浏览器F12的网络请求里的完整URL,对比路由规则再调整~
内容的提问来源于stack exchange,提问作者SxChoc

