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();
我遵循了 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();