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

Mr.*_*ble 5 asp.net-mvc routing url-routing asp.net-mvc-routing

我正在尝试创建一个全能路由来跟踪联盟字符串何时在URL中.联盟代码由a x后跟a 标记int,并且仅出现在URL的末尾(但在查询字符串之前).

我的想法是,我将提取联盟会员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
Run Code Online (Sandbox Code Playgroud)

我有这条路

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}" })
});
Run Code Online (Sandbox Code Playgroud)

哪个只匹配

http://www.domain.com/path/x32
http://www.domain.com/path/x32/
Run Code Online (Sandbox Code Playgroud)

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

ste*_*son 10

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

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

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

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