我正在尝试创建一个控制器操作,它接收几个用于过滤范围的参数,然后最终参数是一个必需的分页参数,用于分页结果。
//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工作。
答案 0 :(得分:1)
不,不是没有创建另一条特定路线或将localscope
作为最后一个参数。
使用路由时,只有最后一个参数可以标记为UrlParameter.Optional
。如果多于一个是可选的,则路由引擎无法知道哪个路径段适用于哪个方法参数。
如果您的网址为../Details/May-17/Mid/1
,那么1
的值为localscope
的最后一段是page
的值还是@Url.Action()
的值?没有办法确定,所以如果你使用select UpdateOn=dateadd(hh,datepart(hh,UpdateOn), cast(CAST(UpdateOn as date) as datetime)), round(AVG(P1Temp), 1)
from TABLE
where UpdateOn between dateadd(day,-1,getdate()) and getdate()
group by dateadd(hh,datepart(hh,UpdateOn), cast(CAST(UpdateOn as date) as datetime))
Result (splits over two calendar days but returns 25 results (24 hours))
(或生成url的其他方法之一)生成url,那么将使用查询字符串值生成url,而不是路由值。< / p>