【问题标题】:asp.mvc 4 more routesasp.mvc 还有 4 条路线
【发布时间】:2013-08-02 18:20:53
【问题描述】:

我有一个使用 asp.net MVC 4 构建的 Web 应用程序。 我想要以下 3 种类型的路线:

  1. /动作
  2. /action/id
  3. /id/id2

在 global.asax 中,我将路线更改如下:

routes.MapRoute(
           name: "Without Action",
           url: "{id}/{id2}",
           defaults: new { controller = "Home", action = "City_Category" },
           namespaces: new[] { "Namespace.Controllers" }
        );

        routes.MapRoute(
            name: "Without Controller",
            url: "{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "Namespace.Controllers" }
        );

但是当我尝试 {action}/{id} 时,它会转到 global.asax 中定义的第一条路线。仅当 url 为 {action} 或 {id}/{id2} 时才有效。

我怎样才能使所有 3 条路线都工作?

谢谢!

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-routing global-asax


    【解决方案1】:

    如果{id}{id2} 始终为数字,您可以向路由添加一个约束,使其仅在这些值为数字时生效:

    routes.MapRoute(
               name: "Without Action",
               url: "{id}/{id2}",
               defaults: new { controller = "Home", action = "City_Category" },
               new { id = @"\d+", id2 = @"\d+" }
               namespaces: new[] { "Namespace.Controllers" }
            );
    

    【讨论】:

    • {id} 和 {id2} 将是字符串
    • 那么在这种情况下,路由器无法区分您传递的字符串是 id 还是 action。您可以使用此答案中的相同方法将 {action}/{id} 路由限制为字符串的子集,例如:new { action = @"[Index|Edit|Create]" }。请记住将其放在另一个之上,因为它们会按顺序进行评估...
    • 我试图把这条路线放在第一位,但是这样第二条有 2 个 ID 的路线不起作用
    【解决方案2】:

    另一个思路是使用http://attributerouting.net/,可以通过属性定义路由,这是一个非常容易定义路由的方法,尤其是当你最终得到很多复杂的路由时。我有大约 30 个路由定义和许多 cmets,每个操作的 url 看起来如何。我可以删除所有具有这些属性的 cmets 和路由定义。

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 2014-12-19
      • 2014-01-10
      • 2015-12-10
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 2013-08-14
      相关资源
      最近更新 更多