【发布时间】: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 等于 1 和 p2 等于 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