【问题标题】:In ASP.NET MVC, how can I match URLs to a route if an URL segment contains literal dashes and one of the parameter constraints allows dashes?在 ASP.NET MVC 中,如果 URL 段包含文字破折号并且参数约束之一允许破折号,我如何将 URL 与路由匹配?
【发布时间】:2015-11-23 07:49:40
【问题描述】:

鉴于这条路线:

{prefix}-{id}-{postfix}

有一个 URL 段和 3 个所谓的参数:prefixidpostfix。任何带有 3 个破折号的 URL 通常会匹配此路由(如果参数值匹配为这些参数定义的约束)。但是,一旦我为第三个参数定义了一个允许破折号的正则表达式约束,整个路由就不再匹配。

例如:

routes.MapRoute(
    url: "{prefix}-{id}-{postfix}", 
    constraints: new {
        prefix: "test",
        id: "42"
        postfix: "[a-z-]+"
    }
);

这将匹配到 ~/test-42-hello-world/ 的请求

我的意思是 ASP.NET 路由引擎甚至不考虑这个 URL 的路由。我知道这是因为我用自定义的IRouteConstraint 替换了其中一个约束,并在其Match() 方法中放置了一个断点,而我的断点从未被命中。

我想知道我想做的事情是否可行。

如果没有,我非常感谢提供一些文档(或来源)的链接,我可以查看这些链接以了解这不起作用的原因。

【问题讨论】:

  • 你是怎么解决这个问题的?您是否找到了在段中使用破折号以便正确识别值为 hello-world 的参数的方法?

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


【解决方案1】:

很简单,在这种情况下,您的网址不匹配。 url patterns documentation 解释了,可惜不是很好。

在 URL 模式中,您可以通过将占位符括在大括号( { 和 } )中来定义占位符。您可以在一个段中定义多个占位符,但它们必须用文字值分隔。例如,{language}-{country}/{action} 是一个有效的路由模式。但是,{language}{country}/{action} 不是有效模式,因为占位符之间没有文字值或分隔符。 因此,路由无法确定将语言占位符的值与国家占位符的值分开的位置。

在确定什么是字面值时,同样的逻辑也成立。一旦将值用作文字,框架将无法区分文字和包含文字的占位符。

路由引擎首先看到的是定义的 URL 模式。这发生在甚至考虑任何约束之前。

您的 URL 模式按顺序包含以下内容。

  1. {prefix} 占位符
  2. 文字 -(破折号)字符
  3. {id} 占位符
  4. 文字 -(破折号)字符
  5. {postfix} 占位符

将您传入的虚拟路径test-42-hello-world 与每个部分进行比较。

  1. {prefix} 占位符匹配 test
  2. 文字-(破折号)字符匹配-
  3. {id} 占位符匹配 42
  4. 文字-(破折号)字符匹配-
  5. {postfix} 占位符匹配 hello

问题是现在虚拟路径末尾有多余的信息不匹配,即-world。这使得整个 URL 模式不匹配。

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    相关资源
    最近更新 更多