在ASP.NET MVC中,如果URL段包含文字破折号并且其中一个参数约束允许破折号,如何将URL匹配到路径?

时间:2015-08-28 15:27:44

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

鉴于这条路线:

prefix

有一个网址段和3个所谓的参数:idpostfixroutes.MapRoute( url: "{prefix}-{id}-{postfix}", constraints: new { prefix: "test", id: "42" postfix: "[a-z-]+" } ); 。具有3个破折号的任何URL通常都匹配此路径(如果参数值与为这些参数定义的约束匹配)。但是,一旦我为第3个参数定义了允许破折号的正则表达式约束,整个路线就不再匹配了。

例如:

IRouteConstraint

这将匹配对〜/ test-42-hello-world /

的请求

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

我想知道我想做什么是可能的。

如果没有,我真的很感激链接到我可以看到的一些文档(或来源),以了解它不起作用的原因。

1 个答案:

答案 0 :(得分:4)

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

  

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

在确定字面值时,同样的逻辑也适用。将值用作文字后,框架将无法区分文字与包含文字的占位符。

路由引擎看起来的第一件事是定义的URL模式。这在即使考虑任何约束之前发生。

您的网址格式按顺序包含以下内容。

  1. {prefix}占位符
  2. 文字-(短划线)字符
  3. {id}占位符
  4. 文字-(短划线)字符
  5. {postfix}占位符
  6. 将传入的虚拟路径test-42-hello-world与每个部分进行比较。

    1. {prefix}占位符匹配test
    2. 文字-(短划线)字符匹配-
    3. {id}占位符匹配42
    4. 文字-(短划线)字符匹配-
    5. {postfix}占位符匹配hello
    6. 问题是现在虚拟路径末尾有额外信息不匹配,即-world。这使得整个URL模式不匹配。