ASP.NET Core中Url.Action生成链接跳转错误,访问SubmitCart跳转到GetItemsInCart
问题排查方案
按优先级逐一排查即可定位原因:
- 确认属性路由已启用
你在Action上标记的[Route]属于属性路由范畴,但当前的MVC配置只注册了约定路由,没有开启属性路由支持,需要补充配置:
app.UseMvc(routes => { routes.MapMvcAttributeRoutes(); // 新增这行启用属性路由 routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
未启用属性路由时,你标记的[Route("SubmitCart")]不会生效,路由系统只会走默认约定规则匹配请求。
2. 检查路由模板冲突
如果已经启用了属性路由,需要确认路由模板配置是否合理:
- 如果ShoppingCart控制器没有加
[Route("[controller]")]前缀特性,那么Action上的[Route("SubmitCart")]对应的访问路径是根路径下的/SubmitCart,而非/ShoppingCart/SubmitCart - 如果控制器加了前缀路由,检查两个Action的路由模板是否存在模糊匹配,比如是否使用通配符、可选参数导致
SubmitCart的路由被GetItemsInCart的路由提前匹配到
- 检查Action的动词约束
如果SubmitCart方法上加了[HttpPost]、[AcceptVerbs("POST")]等特性,你通过锚点点击、地址栏直接输入发起的都是GET请求,无法匹配到SubmitCart,路由系统会继续匹配同控制器下其他支持GET请求的Action,就可能落到GetItemsInCart上。 - 验证请求是否进入SubmitCart方法
在SubmitCart方法第一行加断点调试:
- 如果断点没有命中,说明路由匹配阶段就匹配到了其他Action,建议开启路由日志查看匹配过程:在appsettings.json中配置日志级别
{ "Logging": { "LogLevel": { "Microsoft.AspNetCore.Routing": "Debug" } } }
运行后查看控制台的路由匹配日志,就能明确看到请求被匹配到了哪个Action以及匹配原因
- 如果断点命中,说明是方法内部或者后续中间件做了重定向,检查
RedirectToAction("ViewReceipt")对应的ViewReceipt方法是否存在,或者ViewReceipt内部有没有重定向到GetItemsInCart的逻辑
- 检查全局重定向规则
确认是否配置了URL重写中间件、授权重定向规则:比如SubmitCart上加了[Authorize]特性,未登录时会被身份验证中间件重定向到其他地址,刚好重定向逻辑最后落到了GetItemsInCart上。
内容的提问来源于stack exchange,提问作者learning_bug
相关产品推荐
相关产品推荐

