【问题标题】:Different route configurations going to the same action method不同的路由配置去同一个动作方法
【发布时间】:2014-08-06 13:34:26
【问题描述】:

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

我正在尝试显示以下 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方法。

我怎样才能做到这一点?

【问题讨论】:

  • MVC 如何确定paarl 是一个地区而western-cape 是一个省?您无法做到这一点的唯一方法是创建一个尝试确定它是什么的操作并手动路由到正确的操作。

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


【解决方案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" }
);

希望对你有帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      相关资源
      最近更新 更多