ASP.NET MVC4 - 具有 actionLinks 的 2 个控制器的不同路由

ASP.NET MVC4 - Different routing for 2 controllers with actionLinks

好的,我有两个控制器:
家庭控制器
数学控制器

我希望 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 控制器创建 link:@Html.ActionLink("Hem", "Hem", "Home", null, new { @class = "navbar-brand" })

如何配置路由或操作 links 以便获得首选功能?

路线在 RouteConfig.cs 中自上而下匹配。您的问题是两个路由配置都是 "catch all" 路由,这意味着它们都适用于任何 controller/action。当您使用 @Html.ActionLink 时,MVC 将根据它找到的第一条路线呈现 url,这与您的 "Task" 路径相匹配。有几种方法可以更改此设置以获得您想要的内容。

如果您只想使用数学控制器的 "Task" 路径,那么我会将您的路径更改为:

routes.MapRoute(
    name: "Math",
    url: "Task/Math/{action}",
    defaults: new { controller = "Math", action = "Index" }
);

如果你想为 "Task" 路径使用多个控制器,那么你可以添加一个路由约束。您可以像下面那样使用它并指定控制器列表(正则表达式),或者您可以创建自己的自定义路由约束 class 并实现您想要的任何功能。

routes.MapRoute(
    name: "Math",
    url: "Task/{controller}/{action}",
    defaults: new { controller = "Math", action = "Index" },
    constraints: new { controller = "Math|OtherController" }
);

或者如果你想保留所有 controllers/actions 匹配两个 urls,那么你必须翻转你的路线,让默认路线首先显示,或者你可以使用 @Html.RouteLink 像这样:

@Html.RouteLink("Hem", "Default", new { controller = "Home", action = "Hem" }, new { @class = "navbar-brand" })