You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core访问Cart、Product控制器Index页返回404错误如何解决

问题根本原因

ASP.NET Core的路由匹配是按照UseEndpoints中的注册顺序从上到下执行的,你注册的第一个路由规则pages的匹配规则为{slug?},所有单段路径的请求(比如/cart、/product)都会优先被这个路由捕获,将路径段作为slug参数传给Pages控制器的Page方法,而你的Page方法显然没有对应cart、product的处理逻辑,自然返回404。
而Products控制器的ProductByCategory方法可以正常访问,是因为它的请求路径为/products/xxx,会被第二个注册的products路由正确匹配,不会触发第一个宽泛的slug路由。

修复方案

你可以任选以下一种方案解决问题:

  • 方案1:调整路由注册顺序,把最宽泛的pages路由放到所有路由的最后面,让更具体的路由优先匹配:
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        "products",
        "products/{categorySlug}",
        defaults: new { controller = "Products", action = "ProductsByCategory" }
    );

    endpoints.MapControllerRoute(
        name: "areas",
        pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
    );

    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    
    // 最宽泛的路由放到最后注册
    endpoints.MapControllerRoute(
        "pages",
        "{slug?}",
        defaults: new { controller = "Pages", action = "Page" }
    );
});

调整后访问/cart会先匹配默认路由,自动映射到CartController的Index方法,不会被slug路由拦截。

  • 方案2:给对应控制器的Index方法添加属性路由,属性路由的优先级高于约定路由,会优先匹配:
    在CartController的Index方法上加特性:
[Route("cart")]
public IActionResult Index()
{
    // 原有逻辑保持不变
}

同理给ProductController的Index方法加[Route("product")]特性即可。

  • 方案3:给slug路由添加约束,限制只有匹配特定规则的slug才会触发该路由,比如排除cart、product等已存在的控制器名称,避免匹配冲突。

通用排查技巧

如果后续再遇到路由匹配问题,可以开启ASP.NET Core的路由日志,或者引入官方路由调试中间件,直接查看每个请求匹配到的路由规则、参数值,就能快速定位匹配错误的原因。


内容的提问来源于stack exchange,提问作者soe thein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:57:02