ASP.NET MVC 5 - 从URL删除控制器名称对其他控制器失败

时间:2015-07-20 13:55:32

标签: asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing

我跟随answerthis question但是当我应用它时,如果我尝试访问其他控制器下的视图,我会收到错误。

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

  

“无法找到资源。”

如果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 }
);

2 个答案:

答案 0 :(得分:2)

最好使用Route属性。

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

}

然后在RouteConfig

之前的routes.MapRoute课程中添加此行
routes.MapMvcAttributeRoutes();

答案 1 :(得分:1)

问题是路由器无法正确解析路由冲突

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 }
);

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