Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 MVC4路由中的可选中间参数_Asp.net Mvc 4_Asp.net Mvc Routing - Fatal编程技术网

Asp.net mvc 4 MVC4路由中的可选中间参数

Asp.net mvc 4 MVC4路由中的可选中间参数,asp.net-mvc-4,asp.net-mvc-routing,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",

我试图创建一个控制器操作,该操作接收多个参数以过滤作用域,然后最后一个参数是分页结果所需的分页参数

//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)

我知道我可以在现有路线之前添加路线:

//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
作为最后一个参数

使用路由时,只有最后一个参数可以标记为
urlparmeter。可选
。如果多个选项是可选的,则路由引擎无法知道哪个路由段应用于哪个方法参数


在您的情况下,当url为
。/Details/May-17/Mid/1
时,值为
1
的最后一段是
localscope
的值还是
page
的值?无法确定这一点,因此,如果要使用
@url.Action()
(或生成url的其他方法之一)生成url,则将使用查询字符串值而不是路由值生成url。

简短回答是否(除非创建多个路由)。只有最后一个参数是可选的。@StephenMuecke是我添加的备选选项中的一个,您推荐哪一个?或者如果你有其他的方法,我很乐意阅读。就我个人而言,我会选择你的第一个选择,只是因为我认为作为一个url,有页码更有意义last@StephenMuecke,你介意把其中的一部分写进答案里吗?这样我就可以核对一下。
routes.MapRoute(
    name: "LocationWithLocalScopeRoute",
    url: "/Details/{page}/{time}/{regionscope}/{localscope}",
    defaults: new
    {
        controller = "Location",
        action = "Details",
        localscope = UrlParameter.Optional
    }
);