【发布时间】: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