MVC4 路由中的可选中间参数



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

//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的值还是page的值?无法确定这一点,因此,如果要使用@Url.Action()(或生成 url 的其他方法之一)生成 url,则将使用查询字符串值而不是路由值生成 url。

最新更新