ASP.NET MVC 属性路由未命中正确的控制器

ASP.NET MVC attribute routing not hitting correct controller

我有几个这样的控制器:

[RoutePrefix("side-navigation")]
public class SideNavigationController : BaseController
{
    [Route("{pathname}")]
    public ActionResult Index(string pathname)
    {
        SideNavigationPopoutModel model = _sideNavFactory.Value.CreatePopout(pathname);

        if (model != null)
        {
            return View(model);
        }

        return HttpNotFound();
    }
}

public class CatchAllController : BaseController
{
    public ActionResult Index(string pathname)
    {
        CatchAllModel model = _catchAllModelFactory.Value.Create(pathname);

        if (model != null)
        {
            // TODO: Do we need this - what does it do?
            // TempData.Restore(this);

            return View(model);
        }

        return HttpNotFound();
    }
}

但我似乎无法在侧面导航控制器中执行索引操作 - 如果我浏览到 localhost/side-navigation/test 它会使用 side-navigation/test 击中 catch all 控制器,因为它是路径名而不是侧面导航一个以 test 作为路径名。

任何人都可以看到我在这里做错了什么或如何使侧边导航控制器工作吗?

这是路由配置:

// MVC attribute routing
routes.MapMvcAttributeRoutes();

// Default catch all route
routes.MapRoute(
    "Default",
    "{*pathname}",
    new { controller = "CatchAll", action = "Index" });

奇怪的是,如果我将侧边导航索引的路线更改为 test/{pathname} 并浏览至 side-navigation/test/test 它会起作用并且控制器会被击中,但我不想在此之前添加任何内容路径名

看来你没有使用 [Area] 也把属性 [Route("[action]")] 放在方法上面。

好的,我已经通过在路径名前添加一个星号来解决这个问题:

[RoutePrefix("side-navigation")]
public class SideNavigationController : BaseController
{
    [Route("{*pathname}")]
    public ActionResult Index(string pathname)
    {
    }
}

如果有人能解释为什么这行得通而没有星号却行不通,我将不胜感激,因为我也有一个产品控制器的设置方式与不需要星号的方式完全相同

[路由前缀("side-navigation")] public class SideNavigationController : BaseController { [路线(“{*路径名}”)] public ActionResult 索引(字符串路径名) { } }