ASP.NET MVC4 - 两个控制器使用不同路由的ActionLink

3

好的,我有一个案例,其中有两个控制器:
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" }) 如何配置我的路由或操作链接,以便获得首选功能?
1个回答

3
路由匹配在 RouteConfig.cs 中自上而下进行。你的问题是两个路由配置都是“捕获所有”路由,这意味着两者都适用于任何控制器/操作。当你使用 @Html.ActionLink 时,MVC 将根据它找到的第一个路由来渲染 URL,这与你的“Task”路径相匹配。有几种方法可以改变这个结果以达到你想要的效果。
如果你只想为 Math 控制器使用“Task”路径,那么我会将你的路由更改为以下内容:
routes.MapRoute(
    name: "Math",
    url: "Task/Math/{action}",
    defaults: new { controller = "Math", action = "Index" }
);

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

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

如果您想让所有控制器/操作匹配两个url,那么您需要翻转路由以使默认路由显示在前面,或者您可以像这样使用@Html.RouteLink

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

谢谢,非常好的答案!这就是我需要知道的! - jimutt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接