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