2015-08-28 78 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虛擬路徑的末尾額外信息。這會使整個網址格式不匹配。

相關問題