我的应用程序按位置执行项目搜索。 我有一些自定义路由和重定向规则,可以为用户提供一个友好的URL,但我发现其中一些行为很奇怪。
我的路线定义如下:
routes.MapRoute("searchRoute", "search/in-{location}", new { controller = "search", action = "index" });
以下搜索效果很好:
我在这里使用的复杂模式是“ 搜索/在{位置} ”。我还通过将其他空格字符替换为'-'来格式化位置,并在其他位置进行了一些重定向(但此处不相关)。 当搜索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),但仍不确定为什么会发生这种情况,最重要的是如何解决它。
任何帮助将不胜感激
答案 0 :(得分:0)
它不会匹配,因为匹配过程混淆了位置 因为匹配是从右到左完成的,所以应该分配给位置变量的内容的第一部分的文字内容。 所以假设您的 URL 是“/search/in-darwin-city”。 最后是什么? “in-city”,因此假定位置变量等于“city”,但剩下的是“search/in-darw”,它不等于“search/”,因此不匹配。
如果您执行以下操作:“/search/in-darwincity”并将路线设置为“/search/in-{location}”,那么位置变量将是“darwincity”,一切正常。>