0

我正在尝试使用 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 视为控制器,将年份视为操作。我该如何解决这个问题?

4

2 回答 2

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

如果您想创建不同的约束,请参阅这篇关于路由约束的博客文章。

于 2012-08-21T15:08:11.760 回答
0

默认路由必须在您的路由表中最后

于 2012-08-21T15:13:45.453 回答