ASP.NET MVC 5 - 从 url 中删除其他控制器的控制器名称失败

ASP.NET MVC 5 - Removing controller name from url fails for other controllers

我遵循了 answer to this question 但是当我应用它时,如果我尝试访问其他控制器下的视图,我会收到错误消息。

如果我去 http://mydomain/MyActionUnderHome 它工作正常,但如果我去 http://mydomain/SomeOtherController/MyAction 它抛出

"The resource cannot be found."

如果 URL 与默认路由上方的路由定义不匹配,默认路由是否应该接管?
MVC 5 中是否有新的方法可以做到这一点?


我的路线:

routes.MapRoute(
    "HomeRoute",
    "{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
    "AccountRoute",
    "{action}/{id}",
    new { controller = "Account", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

问题是您的路由存在冲突,路由器无法正确解析

routes.MapRoute(
    "HomeRoute",
    "{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
    "AccountRoute",
    "{action}/{id}",
    new { controller = "Account", action = "Index", id = UrlParameter.Optional }
);

当路由器查看路径 /youraction/yourparameter 时,它将解析为第一条路由。

接下来的部分是,当您提供两个值作为 URL 时(如您的示例所示,默认路由器永远不会被调用,因为路由器将您的输入解释为 /action/id 而不是 controller/action/id

如果您将路线更改为:

routes.MapRoute(
    "HomeRoute",
    "index/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

然后你就会得到你的效果。但是您的第二条路线仍然无法调用,因为您的方案不正确。

最好使用 Route 属性。

public class HomeController : Controller 
{
  [Route("")]
  public ActionResult Index() { return View(); }
  [Route("MyAccount")]
  public ActionResult Account() { return View(); }

}

然后在 RouteConfig class routes.MapRoute

之前添加这一行
routes.MapMvcAttributeRoutes();