路由:应用程序根目录的多个参数

时间:2012-08-21 15:00:21

标签: asp.net-mvc routes

我正在尝试使用root设置我的MVC应用程序,如下所示:

  • mysite.com/ - >指数行动
  • mysite.com/thingID - >到CurrentThing行动
  • mysite.com/thingID/year - >到CurrentThing行动

行动:public ActionResult CurrentThing(string thingID, int year)

我还需要常规控制器/动作路径才能使用和不使用id。 ThingID是一个字符串。我定义了以下路线:

        routes.MapRoute(
            "Regular",
            "{controller}/{action}/{id}",
            new { id = UrlParameter.Optional }
        );

        routes.MapRoute(
            "RootSpecificRecord",
            "{thingID}/{year}",
            new { controller = "Things", action = "CurrentThing", year = DateTime.Now.Year }
        );

        routes.MapRoute(
            "Root",
            "",
            new { controller = "Things", action = "Index" }
        );

这一切正常,直到我转到mysite.com/id/year,此时第一条路线将id视为控制器,将年份视为动作。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

路由引擎无法区分

/{controller}/{action}/{id}/{ThingId}/{year}

由于您的id参数是可选的,并且您没有ThingId为id的任何约束。

您可以尝试先放置RootSpecificRecord路由,然后更改Id,以便它只接受整数。这将使它比你的常规路线更具体。假设当然thingID是一个整数,你可以像这样改变你的路线:

        routes.MapRoute(
            "RootSpecificRecord",
            "{thingID}/{year}",
            new { controller = "Things", action = "CurrentThing", year = DateTime.Now.Year },
            new {thingID= @".*\d+.*" }
        );

如果要创建不同的约束,请参阅此blog post有关路径约束的内容。

答案 1 :(得分:0)

默认路线必须是路线表中的最后一个