MVC4 Route中的可选中间参数

时间:2017-12-22 05:33:21

标签: asp.net-mvc-4 asp.net-mvc-routing

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

//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工作。

1 个答案:

答案 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>