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

时间:2012-11-30 18:45:43

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

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

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

应该工作:/ 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+"}
);

2 个答案:

答案 0 :(得分: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+"}
);

我尽可能地将最具体的路线放在第一位,并以最不具体​​的方式结束,但在这种情况下,由于约束,顺序无关紧要。我所说的具体是大多数定义的值,所以在这种情况下你必须定义第一条路线中的排序,你也可以指定页面,所以它比只有页面参数。

答案 1 :(得分:1)

我的输入可能相当晚,但对于仍在寻找答案的其他人。为了简单起见,我会在RoutesConfig文件中使用以下内容

 routes.MapRoute(
     name: "Videos",
     url: "{controller}/{action}/{id}",
     defaults: new { controller = "VideoList", action = "Index", id="" },
     constraints: new { id = @"\d+"}
     );

根据您的实现选择,id可以是UriParameter.Optional,但在这种情况下,它将是id ="" ,因为我们将在运行时传递字符串/ int。

这种风格是从http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs

采用的

约定控制器类要记住的一件事总是以控制器结束,例如VideoListController类。该类应列在包含以下方法的控制器文件夹下

public ActionResult Index(string id)
{
    // note this maps to the action
    // random implementation
    ViewBag.Message=id;
    View()
}

//注意这种方法仍匹配任何字符串...... 要仅匹配整数,必须重写Index方法

public ActionResult Index(int id)
{
     // note this maps to the action
     ViewBag.Message=id;
     View()
}

因此,此方法适用于VideoList / Index / 12 但是在放置VideoList / Index / somerandomtext时它会在运行时抛出错误。这可以通过使用错误页面来解决。 我希望这有帮助。投票,如果它非常有用。