好的,我有这种情况,我有两个控制器:
的的HomeController
的 MathController
我希望HomeController的路由保持默认状态:{controller}/{action}/{id}
。但我想使用http://myurl/Task/Math/{action}
访问MathController中的操作。
所以我所做的就是像这样编写RouteConfig:
routes.MapRoute(
name: "Math",
url: "Task/{controller}/{action}",
defaults: new { controller = "Math", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Hem", id = UrlParameter.Optional }
);
使用上述配置并在浏览器中手动输入URL时,两种路由方法都有效。虽然在尝试添加“actionLink”时,它始终使用Task/{Controller}/{Action}
路由。即使我正在为Home控制器创建链接,如下所示:@Html.ActionLink("Hem", "Hem", "Home", null, new { @class = "navbar-brand" })
如何配置我的路由或操作链接,以便获得首选功能?
答案 0 :(得分:3)
路由在RouteConfig.cs
中自上而下匹配。您的问题是两个路由配置都是“捕获所有”路由,这意味着它们都适用于任何控制器/操作。当您使用@Html.ActionLink
时,MVC将根据找到的第一条路线呈现网址,该路线与您的“任务”路径相匹配。有几种方法可以改变它以获得你想要的东西。
如果您只想使用Math控制器的“任务”路径,那么我会改变您的路线:
routes.MapRoute(
name: "Math",
url: "Task/Math/{action}",
defaults: new { controller = "Math", action = "Index" }
);
如果要为“任务”路径使用多个控制器,则可以添加路径约束。您可以像下面一样使用它并指定控制器列表(正则表达式),或者您可以创建自己的自定义Route Constraint类并实现您想要的任何功能。
routes.MapRoute(
name: "Math",
url: "Task/{controller}/{action}",
defaults: new { controller = "Math", action = "Index" },
constraints: new { controller = "Math|OtherController" }
);
或者如果你想保持所有控制器/动作都匹配两个网址,那么你必须翻转你的路线以获得首先显示的默认路线,或者你可以使用@Html.RouteLink
,如下所示:
@Html.RouteLink("Hem", "Default", new { controller = "Home", action = "Hem" }, new { @class = "navbar-brand" })