2015-08-28 74 views
3

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

{prefix}-{id}-{postfix} 

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

例如:

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

这将匹配的请求到〜/测试42问候世界/

而且我的意思是,ASP.NET路由引擎做甚至没有考虑这个网址的路线。我知道,因为我用自定义IRouteConstraint取代了其中一个约束,并在其Match()方法中放置了一个断点,并且我的断点从未被击中。

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

如果不是的话,我会非常感激链接到一些文档(或源代码),我可以通过这些链接了解这种方法无效的原因。

+0

你是如何解决这个问题的?你有没有找到在段中使用破折号的方法,所以值“hello-world”的参数被正确识别? – mykhailovskyi

回答

4

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

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

当确定文字值是什么时,同样的逻辑成立。一旦将一个值用作文字,框架将无法将文字与包含文字的占位符区分开来。

路由引擎看起来第一件事是定义的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虚拟路径的末尾额外信息。这会使整个网址格式不匹配。