【问题标题】:Optional middle parameter in MVC4 RouteMVC4 Route 中的可选中间参数
【发布时间】:2017-12-22 05:33:21
【问题描述】:

我正在尝试创建一个控制器操作,该操作接收多个用于过滤范围的参数,然后最后一个参数是对结果进行分页所需的分页参数。

//Example Action
public ActionResult Details(string time, string regionscope, string localscope = null, int page = 1) {

}

//RouteConfig.cs
routes.MapRoute(
    name: "LocationWithLocalScopeRoute",
    url: "/Details/{time}/{regionscope}/{localscope}/{page}",
    defaults: new
    {
        controller = "Location",
        action = "Details",
        localscope = UrlParameter.Optional
    }
);

无论如何我可以排除localscope 参数,但仍然让page 参数被控制器解释为页码(同时仍然保持漂亮的URL)?

// Test URLs
/Details/May-17/Mid/1
/Details/May-17/Mid/Bumville/1

我知道我可以在现有路线之前添加一条路线:

//RouteConfig.cs
routes.MapRoute(
    name: "LocationWithNoLocalScopeRoute",
    url: "/Details/{time}/{regionscope}/{page}",
    defaults: new
    {
        controller = "Location",
        action = "Details"
    }
);

我也意识到我可以将page 放在任何其他参数之前。

routes.MapRoute(
    name: "LocationWithLocalScopeRoute",
    url: "/Details/{page}/{time}/{regionscope}/{localscope}",
    defaults: new
    {
        controller = "Location",
        action = "Details",
        localscope = UrlParameter.Optional
    }
);

只是想知道是否有办法让它在一个路由定义中全部工作,同时仍然让测试 URL 工作。

【问题讨论】:

  • 简短的回答是否定的(除非您创建多条路线)。只有最后一个参数可以是可选的。
  • @StephenMuecke 在我添加的其他选项中,您会推荐哪个?或者,如果您有其他方法,我很乐意阅读。
  • 就个人而言,我会选择您的第一个选项,只是因为我认为将页码放在最后更有意义
  • @StephenMuecke,您介意将其中一些内容放入答案中,以便我将其作为答案进行检查。

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


【解决方案1】:

不,除非创建另一个特定路由或将localscope 作为最后一个参数。

使用路由时,只有最后一个参数可以标记为UrlParameter.Optional。如果不止一个是可选的,那么路由引擎就无法知道哪个路由段适用于哪个方法参数。

在您的情况下,当 url 为 ../Details/May-17/Mid/1 时,最后一段的值为 1 的值是 localscope 的值还是 page 的值?无法确定这一点,因此如果您要使用 @Url.Action()(或生成 url 的其他方法之一)生成 url,则将使用查询字符串值而不是路由值生成 url。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 2015-01-28
    • 2017-05-02
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2015-11-14
    相关资源
    最近更新 更多