鉴于这条路线:
prefix
有一个网址段和3个所谓的参数:id
,postfix
和routes.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();
方法中放置了断点,并且我的断点从未被击中。
我想知道我想做什么是可能的。
如果没有,我真的很感激链接到我可以看到的一些文档(或来源),以了解它不起作用的原因。
答案 0 :(得分:4)
很简单,在这种情况下,您的网址不匹配。 url patterns documentation解释了它,但不幸的是不太好。
在URL模式中,您可以通过将它们括在大括号({和})中来定义占位符。您可以在段中定义多个占位符,但它们必须用文字值分隔。例如,{language} - {country} / {action}是有效的路由模式。但是,{language} {country} / {action}不是有效模式,因为占位符之间没有文字值或分隔符。 因此,路由无法确定将语言占位符的值与国家/地区占位符的值分开的位置。
在确定字面值时,同样的逻辑也适用。将值用作文字后,框架将无法区分文字与包含文字的占位符。
路由引擎看起来的第一件事是定义的URL模式。这在即使考虑任何约束之前发生。
您的网址格式按顺序包含以下内容。
{prefix}
占位符-
(短划线)字符{id}
占位符-
(短划线)字符{postfix}
占位符将传入的虚拟路径test-42-hello-world
与每个部分进行比较。
{prefix}
占位符匹配test
-
(短划线)字符匹配-
{id}
占位符匹配42
-
(短划线)字符匹配-
{postfix}
占位符匹配hello
问题是现在虚拟路径末尾有额外信息不匹配,即-world
。这使得整个URL模式不匹配。