【问题标题】:Routing issue with complex segments复杂段的路由问题
【发布时间】:2019-09-02 18:44:29
【问题描述】:

我的应用程序按位置执行项目搜索。 我有一些自定义路由和重定向规则来为用户提供一个友好的 URL,但我只是注意到其中一些有奇怪的行为。

我的路线定义如下:

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

以下搜索效果很好:

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

我在这里使用的复杂模式是“search/in-{location}”。我还通过用“-”替换任何空白字符来格式化位置,并在其他地方进行一些重定向(但在这里不相关).. 当搜索 URL 的位置包含“in-”时会出现问题:

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

微软文档 (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),但仍然不确定为什么会发生这种情况,最重要的是如何解决。

任何帮助将不胜感激

【问题讨论】:

  • 你的标签是ASP.Net MVC,但你的文档链接是ASP.Net Core MVC。你是.Net Core 还是.Net Framework
  • 我在两个不同的应用程序中都使用了相同的问题。我不相信 .NET 版本(4.5 或 Core 2.2)是相关的,因为路由引擎似乎是相同的。
  • 不确定路由引擎,但一般ASP.Net Core MVCASP.Net MVC 的几乎完全重写的版本 - 不应期望它们的行为相同。另外,“你在使用 .Net Core 还是 .Net Framework?” 我的意思是“你使用的是 ASP.Net Core MVC 还是经典的 ASP.Net MVC?”,抱歉误导?
  • 您也可以尝试使用"search/in-{*location}"(这应该使它变得贪婪),但我不确定它将如何处理 /search/in-testin-test/something?query =数据

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2014-11-07
    • 2021-07-04
    • 1970-01-01
    • 2013-11-20
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多