不同的路由配置转到相同的操作方法

时间:2014-08-06 13:34:27

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我想显示每个省或每个区域的山地自行车道列表。一个省由许多地区组成。

我正在尝试显示以下2个网址:

  • www.mywebsite.com/paarl-trails (area trails)
  • www.mywebsite.com/western-cape-trails (province trails)

我有以下路线配置(按此顺序):

routes.MapRoute(
    name: "ProvinceDefault",
    url: "{seoProvinceName}-trails",
    defaults: new { controller = "Province", action = "Index" },
    namespaces: new[] { "MyProject.WebUI.Controllers" }
);

routes.MapRoute(
    name: "AreaDefault",
    url: "{seoAreaName}-trails",
    defaults: new { controller = "Area", action = "Index" },
    namespaces: new[] { "MyProject.WebUI.Controllers" }
);

这是我在视图中创建链接的方式:

<a href="@Url.RouteUrl("AreaDefault", new { seoAreaName = trail.Area.SeoName })">@trail.Area.Name</a>,
<a href="@Url.RouteUrl("ProvinceDefault", new { seoProvinceName = trail.Area.Province.SeoName })">@trail.Area.Province.Name</a>

链接显示正确但两者都被重定向到省控制器的Index方法。我更改了2个路由配置,但随后它们都转到区域控制器的Index方法。

我希望www.mywebsite.com/paarl-trails转到区域控制器的Index方法,我希望www.mywebsite.com/western-cape-trails转到省控制器的Index方法。

我如何做到这一点?

2 个答案:

答案 0 :(得分:1)

我同意之前的回答,因为ASP.NET MVC路由引擎无法区分这两个路由。您可以做的是在SEOProvinceName之前添加区域名称。这样,路线就是这样的:

  • www.mywebsite.com/paarl-area-trails(区域步道)
  • www.mywebsite.com/paarl-area/western-cape-province-trails(与该地区的省道)

为了使这项工作,路线应该是这样的:

routes.MapRoute(
    name: "ProvinceDefault",
    url: "{seoAreaName}/{seoProvinceName}-province-trails",
    defaults: new { controller = "Province", action = "Index" },
    namespaces: new[] { "MyProject.WebUI.Controllers" }
);

routes.MapRoute(
    name: "AreaDefault",
    url: "{seoAreaName}-area-trails",
    defaults: new { controller = "Area", action = "Index" },
    namespaces: new[] { "MyProject.WebUI.Controllers" }
);

我希望它有所帮助。

答案 1 :(得分:0)

MVC路由不是这样工作的。当从服务器请求URL时,路由引擎按照您定义的顺序选择与URL匹配的第一条路由。路由系统无法区分您已定义的两条路由,因为它们看起来相同:-trails后面的内容。

您必须更改URL及其路由才能使路由引擎正确处理它们,如下所示:

网址:

  • www.mywebsite.com/paarl-area-trails(区域步道)
  • www.mywebsite.com/western-cape-province-trails(省足迹)

路线:

routes.MapRoute(
    name: "ProvinceDefault",
    url: "{seoProvinceName}-province-trails",
    defaults: new { controller = "Province", action = "Index" },
    namespaces: new[] { "MyProject.WebUI.Controllers" }
);

routes.MapRoute(
    name: "AreaDefault",
    url: "{seoAreaName}-area-trails",
    defaults: new { controller = "Area", action = "Index" },
    namespaces: new[] { "MyProject.WebUI.Controllers" }
);