Asp.Net MVC路由 - 如何匹配整个URL?

时间:2009-10-24 19:48:50

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

我正在尝试创建一个catch-all路由来跟踪联盟字符串何时在URL中。关联代码由x后跟int标记,并且只会显示在网址的末尾(但在查询字符串之前)。

我的想法是,我将提取联盟会员ID,进行一些日志记录,然后在没有会员ID的情况下对同一请求执行301。

例如:

http://www.domain.com/x32
http://www.domain.com/x32/
http://www.domain.com/path/to/something/x32
http://www.domain.com/x32?query=string
http://www.domain.com/x32/?query=string
http://www.domain.com/path/to/something/x32?query=string
http://www.domain.com/path/to/something/x32/?query=string

我有这条路线

routes.Add(new Route("{url}/x{affiliateExternalId}", new MvcRouteHandler())
{
     Defaults = new RouteValueDictionary(
      new { controller = "Home", action = "LogCookieAndRedirect" }
     ),
     Constraints = new RouteValueDictionary(new { affiliateExternalId = @"\d{1,6}" })
});

仅匹配

http://www.domain.com/path/x32
http://www.domain.com/path/x32/

我需要做什么来匹配所有内容并将查询字符串传递给控制器​​?有一个*运算符,我怀疑我应该使用它,但我不能让它做我需要的。

3 个答案:

答案 0 :(得分:10)

{*url}将匹配整个路径,而不仅仅是一个段。但是,由于它匹配整个路径,因此您无法在最后匹配联属会员ID。该路线将匹配每个请求。您可以通过添加路由约束来检查url最后是否有联盟ID:

routes.MapRoute(
    "WithAffiliate",
    "{*url}",
    new { controller="Home", action="LogCookieAndRedirect" },
    new { url = @"/x[0-9]+$" }
 );

然后,您的操作需要解析url参数本身的联盟会员ID。如果您可以选择修改URL结构,则可以匹配ID,如果它位于路径的开头:

routes.MapRoute(
    "WithAffiliate",
    "x{affiliateExternalId}/{*url}",
    new { controller="Home", action="LogCookieAndRedirect" }
 );

答案 1 :(得分:0)

如果我这样做,我会把它作为查询字符串中的一个值。

示例:

http//www.domain.com/path/to/something?affiliate=X32&query=string

问题是会员ID是可选。如果你把它放在路径中,你将根据联盟会员身份是否存在来改变路径的结构,所以你必须做两次你的每一条路线(一次是联盟会员身份证,一次是没有)

答案 2 :(得分:0)

如果只定义了一条路线,则只能拥有此全能路线。但是如果你有多条路线,那么你将不得不将{affiliateExternalId}参数添加到所有路线(除非我遗漏了一些东西)。

我第二次Robert Harveysuggestion