【问题标题】:Routes: multiple parameters for the application root路由:应用程序根的多个参数
【发布时间】:2012-08-21 15:00:21
【问题描述】:

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

【问题讨论】:

    标签: asp.net-mvc routes


    【解决方案1】:

    路由引擎无法分辨两者之间的区别

    /{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 关于路由约束。

    【讨论】:

    • 哎呀,我忘了说 ThingID 是一个字符串,对不起。
    • ThingID 是您可以为其创建正则表达式值的东西吗?您需要创建比常规路线更具体的路线,然后将其置于默认路线之上。
    • 这是有道理的。似乎我的 ThingID 都包含数字,而我的控制器名称却没有。也许这就是关键。如果这不起作用,您还有其他方法可以建议吗?
    • 我的正则表达式不是很好,但我认为我已经更新了正则表达式以匹配任何包含整数的内容。尝试将其移到您的常规路线上方,看看这是否适合您。
    【解决方案2】:

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

    【讨论】:

    • 但是所有常规的控制器/动作/请求都会作为 thingID/year 被拾取并路由到我的 CurrentThing 动作。
    猜你喜欢
    • 1970-01-01
    • 2020-08-30
    • 2021-01-25
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多