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

时间:2019-04-30 10:07:43

标签: c# asp.net-mvc routes asp.net-mvc-5.2

我有几个这样的控制器:

[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作为路径名来捕获所有控制器,而不是侧面导航控制器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,它将正常工作并且控制器将被命中,但是我不想在路径名之前添加任何内容

3 个答案:

答案 0 :(得分:0)

似乎您没有使用[Area],也将属性[Route(“ [action]”)]置于方法上方。

答案 1 :(得分:0)

好,我通过在路径名之前添加星号来解决此问题:

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

如果任何人都可以解释为什么这种方法有效并且没有星号的话,那将不胜感激,因为我还以与不需要星号完全相同的方式设置了产品控制器

答案 2 :(得分:-3)

[RoutePrefix(“侧面导航”)] 公共类SideNavigationController:BaseController {     [Route(“ {* pathname}”)]     公共ActionResult索引(字符串路径名)     {     } }