MVC4 Route中的可选中间参数

Optional middle parameter in MVC4 Route

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

//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 工作。

不,如果不创建另一个特定路由或将 localscope 作为最后一个参数,就不行。

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

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