复杂细分的路由问题

时间:2019-04-12 03:46:44

标签: c# regex asp.net-mvc url-routing

我的应用程序按位置执行项目搜索。 我有一些自定义路由和重定向规则,可以为用户提供一个友好的URL,但我发现其中一些行为很奇怪。

我的路线定义如下:

routes.MapRoute("searchRoute", "search/in-{location}", new { controller = "search", action = "index" });

以下搜索效果很好:

  • / search /在墨尔本
  • / search / in-western-australia
  • / search / in-悉尼-NSW
  • / search / in-perth-WA-6000
  • / search / in-brisbane-CBD
  • / search / in-australian-capital-territory-act

我在这里使用的复杂模式是“ 搜索/在{位置} ”。我还通过将其他空格字符替换为'-'来格式化位置,并在其他位置进行了一些重定向(但此处不相关)。 当搜索URL的位置包含“ in-”时会发生此问题:

例如,URL / search / in-darwin-city / search / in-testin-test 与我的searchRoute不匹配(我使用RouteDebugger确认,甚至测试了除“ in-”以外的其他关键字(没有运气)。

Microsoft文档(https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-2.2#complex-segments)说:

  

复杂的细分(例如 [Route(“ / x {token} y”)] ))由   从右到左以非贪婪的方式匹配文字。

我看过代码(https://github.com/aspnet/AspNetCore/blob/release/2.2/src/Http/Routing/src/Patterns/RoutePatternMatcher.cs#L293),但仍不确定为什么会发生这种情况,最重要的是如何解决它。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

它不会匹配,因为匹配过程混淆了位置 因为匹配是从右到左完成的,所以应该分配给位置变量的内容的第一部分的文字内容。 所以假设您的 URL 是“/search/in-darwin-city”。 最后是什么? “in-city”,因此假定位置变量等于“city”,但剩下的是“search/in-darw”,它不等于“search/”,因此不匹配。

如果您执行以下操作:“/search/in-darwincity”并将路线设置为“/search/in-{location}”,那么位置变量将是“darwincity”,一切正常。