如何在ASP.net MVC 4 RouteConfig.cs中使用约束?

Mad*_*r24 7 asp.net-mvc asp.net-mvc-4

我正在尝试使用最新的asp.net mvc 4架构来解决一些路由限制.在App_Start下有一个名为RouteConfig.cs的文件.

如果我从下面的示例中删除约束部分,则网址有效.但是我需要添加一些约束,以便url在所有内容上都不匹配.

应该工作:/ videos/rating/1

不工作:/ videos/2458/Text-Goes-Here

这就是我所拥有的:

//URL: /videos/rating/1
routes.MapRoute(
    name: "Videos",
    url: "videos/{Sort}/{Page}",
    defaults: new { controller = "VideoList", action = "Index", Sort = UrlParameter.Optional, Page = UrlParameter.Optional },
    constraints: new { Sort = @"[a-zA-Z]", Page = @"\d+"}
);
Run Code Online (Sandbox Code Playgroud)

Nic*_*sen 11

如果您想在同一路线上使用多个可选参数,则会遇到麻烦,因为您的网址必须始终指定第一个才能使用第二个.仅仅因为您使用约束并不会阻止它评估参数,而是无法匹配此路由.

以此为例: /videos/3

当它试图匹配时,它会找到视频,然后说:"好的,我仍然匹配".然后它查看下一个参数,即Sort,它得到值3,然后根据约束检查它.约束失败,所以它说"OPPS,我不匹配这条路线",它继续前进到下一条路线.为了指定没有定义sort参数的页面,您应该定义2个路由.

//URL: /videos/rating/1
routes.MapRoute(
    name: "Videos",
    url: "videos/{Sort}/{Page}",
    defaults: new { controller = "VideoList", action = "Index", Page = UrlParameter.Optional },
    constraints: new { Sort = @"[a-zA-Z]+", Page = @"\d+"}
);

//URL: /videos/1
routes.MapRoute(
    name: "Videos",
    url: "videos/{Page}",
    defaults: new { controller = "VideoList", action = "Index", Sort = "the actual default sort value", Page = UrlParameter.Optional },
    constraints: new { Page = @"\d+"}
);
Run Code Online (Sandbox Code Playgroud)

我尽可能地将最具体的路线放在最前面,并以最不具体​​的方式结束,但在这种情况下,由于约束,顺序无关紧要.我的具体含义是大多数定义的值,因此在这种情况下,您必须在第一个路径中定义排序,并且您还可以指定页面,因此它比仅具有page参数的路径更具体.