【问题标题】:Ambigous route matches on slugified urlsslugified url 上的模糊路由匹配
【发布时间】:2019-05-05 20:29:10
【问题描述】:

我的 uri 匹配不明确:Toyota-Corolla-vehicles/2 我已将问题归结为这两条路线

[HttpGet("{make}-vehicles/{makeId:int}")]
[HttpGet("{make}-{query}-vehicles/{makeId:int}")]

对我来说,这看起来很明确。 uri 不应该匹配带有两个破折号的路线吗?

更多上下文: 我正在使用像Toyota-vehicles-in-2005 这样的可读网址。所以我不能使用正斜杠来分隔。

[HttpGet("{make}-vehicles-in-{year}/{makeId:int}")]

文档状态:

复杂的段(例如,[Route("/dog{token}cat")])是 通过在 非贪婪中从右到左匹配文字来处理 方式。有关说明,请参见源代码。有关详细信息,请参阅 这个问题。

https://github.com/aspnet/Routing/blob/9cea167cfac36cf034dbb780e3f783114ef94780/src/Microsoft.AspNetCore.Routing/Patterns/RoutePatternMatcher.cs#L296

https://github.com/aspnet/AspNetCore.Docs/issues/8197

【问题讨论】:

  • 这是一个搜索词的占位符

标签: asp.net-core


【解决方案1】:

我建议你使用这些路线:

[HttpGet("{make}/vehicles/{makeId:int}")]
[HttpGet("{make}/{query}/vehicles/{makeId:int}")]

在这种情况下,Toyota/vehicles/2Toyota/Corolla/vehicles/2 之间没有歧义。在您的情况下,由于{query}string 的类型,所以它有歧义,所以Toyota-Corolla-vehicles 字符串同时匹配{make}-vehicles{make}-{query}-vehicles,因为我们可以像这样解析它:

  1. 所有{make}参数等于Toyota-Corolla;
  2. {make}-{query}等于Toyota-Corolla,其中{make}对应Toyota{query}对应Corolla

所以,问题在于你的角色-。如果你不想改变你的路线,你可以只留下[HttpGet("{make}-vehicles/{makeId:int}")],然后通过string.Split方法区分Toyota-Corolla

【讨论】:

  • 为了可读性,我需要使用 sluggified url。这就是我的问题,为什么这个行得通,而另一个不行?两者都有一个字符用于分隔
  • @AvinKavish 请检查建议的方法。问题正是在那个分隔字符上。
  • 是的,但是 asp net core 应该支持使用字符串文字来分隔参数。默认情况下它是非贪婪匹配的。它不应该按照您描述它的方式行事。请参阅文档中的引用。
  • 是的,在这种情况下,ASP.NET Core 的路由似乎非常违反直觉。无论如何,你总是可以使用Custom Route Constaints,甚至是简单的Regex Constraint Reference
  • 是的,我想我必须使用正则表达式。我已经打开了一个问题以获得一些官方澄清
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多