匹配路线与可选操作

时间:2015-09-15 20:31:47

标签: asp.net-mvc asp.net-mvc-4 routes url-routing asp.net-mvc-routing

我的页面应该接受两个网址,其中一个网页没有应该具有默认值"索引"和一个动作应该链接到用户给定的动作。

链接:

  • 第三方/测试/ 3
  • 第三方/测试/索引/ 3

我想出了以下路线:

 RouteTable.MapRoute("ThirdParty", "{thirdParty}/{controller}/{action}/{type}",
           new { action = "Index" },
           new { thirdParty = "^[a-zA-Z0-9]*$", type = @"\d+" },
           new[] { @namespace });

不幸的是,这只匹配以下路线:

  • SpamReferral /测试/索引/ 3

现在,我已将该操作设为默认值"索引"我认为它会匹配路线,但它并不是。我刚收到404。

为什么它与没有"索引"的路线不匹配?行动? 我正在使用ASP.NET MVC 4。

创建2条路线工作正常,但我很确定它应该在一条路线上工作。

    RouteTable.MapRoute(name, "{thirdParty}/{controller}/{type}",
         new { action = "Index"},
          new { thirdParty = "^[a-zA-Z0-9]*$", type = @"\d+" },
         new[] { @namespace });

        RouteTable.MapRoute(name + "(2)", "{thirdParty}/{controller}/{action}/{type}",
            new { action = "Index" },
            new { thirdParty = "^[a-zA-Z0-9]*$", type = @"\d+"},
            new[] { @namespace });

1 个答案:

答案 0 :(得分:2)

绝不认为制作可以做任何事情的单一路线是最佳做法。如果您需要创建两条路线,那么这是最好的解决方案。

RouteTable.MapRoute(name, "{thirdParty}/{controller}/{type}",
     new { action = "Index"},
      new { thirdParty = "^[a-zA-Z0-9]*$", type = @"\d+" },
     new[] { @namespace });

RouteTable.MapRoute(name + "(2)", "{thirdParty}/{controller}/{action}/{type}",
    new { action = "Index" },
    new { thirdParty = "^[a-zA-Z0-9]*$", type = @"\d+"},
    new[] { @namespace });

此外,不可能在路由模式的中间放置一个可选的占位符 - 它只能作为最右边的位置。因此,使用MapRoute的单一路线无法满足您的要求,因为{action}后面跟着另一个占位符。