【问题标题】:Aspnet greedy route parameterAspnet 贪婪路由参数
【发布时间】:2018-05-21 12:04:42
【问题描述】:

我已经映射了路线:

routes.MapRoute("test", "/{p1:int}-{p2}", new { controller = "test", action = "int" });

这样的路由应该匹配 int-string,比如/1-stuff,它适用于这种情况,但它不适用于/1-stuff-stuff。我猜这是因为路由匹配,然后参数因为 int 约束而被拒绝。

如果我删除约束p1 等于1-stuff,并且p2 等于stuff。有没有办法以正确的方式应用约束或将 p2 标记为“贪婪”(但不是包罗万象),所以 p1 等于 1p2 等于 stuff-stuff

这对于制作人性化的 url 非常重要,其中 id 位于前面,所有内容都是 kebab 大小写,没有额外的字符。

Catch-all 对我不起作用我需要将 p2 绑定到操作参数。正则表达式没有帮助。

【问题讨论】:

  • 对于这样的 slug,通常建议使用以下模式 /{id:int}/{*slug?} 类似于 StackOverflow 如何处理其 URL /questions/50448520/aspnet-greedy-route-parameter
  • 最近给出了类似场景的答案stackoverflow.com/questions/50425902/…
  • 我说我不想要包罗万象的参数。我需要像/{id:int}-{greedy-text-param}/{other-greedy-text-param} 这样的路由,也不能把catch-all放在中间(在其他参数之前)。
  • 您也可以排除全部捕获/{id:int}/{slug?}。当前模板的问题是路由表不知道要采用哪个破折号-。包含附加到 slug 的 id 会导致解析和匹配出现问题
  • 您也可以考虑使用regex 约束来匹配所需的模式。只是一个想法。

标签: asp.net-mvc asp.net-core asp.net-core-mvc asp.net-routing


【解决方案1】:

为什么不试试...

Routes.MapRoute(
    name: "test",
    url: "/{p1}",
    defaults: new { controller = "test", action = "int" },
    constraints: new { p1 = "^\d+-[\w-]*\.*$" }
);

...然后在您的操作中解析 p1

正则表达式可能需要根据您的要求进行一些调整,但在这种情况下 p1 将是 '1-stuff-stuff' 然后您可以 split("-") p1 获取您的值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-15
    • 2010-12-25
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2014-08-21
    相关资源
    最近更新 更多