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 将使用查询字符串值而不是路由值生成。
我正在尝试创建一个控制器操作,它接收多个用于过滤范围的参数,然后最后一个参数是用于对结果进行分页的必需分页参数。
//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 将使用查询字符串值而不是路由值生成。