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

本文关键字:方法 配置 路由 | 更新日期: 2023-09-27 18:16:50

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

我试图显示以下2个url:

  • 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方法。

我怎么做才对?

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

我同意前面的答案,因为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" }
);

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" }
);