Asp.Net MVC路由 - 我怎么整URL匹配吗?(Asp.Net MVC Routing -

2019-09-01 01:27发布

我试图建立一个包罗万象的路线进行跟踪,当一个附属字符串是在URL中。 一个affilite代码是由一个标记x后跟一个int ,并且将仅出现在一个URL(但查询字符串之前)的端部。

这个想法是,我将提取的会员ID,做一些记录,然后做一个301没有会员ID相同的请求。

例如:

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/

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

Answer 1:

{*url}将匹配的完整路径,而不仅仅是一个段。 但是,由于整个路径匹配,则无法再搭配上月底的会员ID。 这条路线将每个请求匹配。 您可以通过添加一个路由约束检查避开这一url有一个最后的会员ID:

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

然后,您的行动将需要从解析的会员ID url参数本身。 如果您需要修改URL结构的选项,这将是可能的,如果它是在路径的开始相匹配的ID:

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


Answer 2:

如果我这样做,我会让它在查询字符串的值之一。

例:

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

问题是,会员ID是可选的 。 如果你把它的路径,你会改变路径的基础上,会员ID是否不存在的结构,所以你必须做你的路线每一个两倍(与会员ID一次,一次不带) 。



Answer 3:

如果你只有一个路由定义你只能拥有这包罗万象的路线。 但是,如果你有多个路由,那么你将不得不将它添加{affiliateExternalId}参数的所有路由(除非我失去了一些东西)。

我第二个罗伯特·哈维的建议 。



文章来源: Asp.Net MVC Routing - how do I match the whole URL?