2009-10-20 47 views
2

鑑於遵循以下圖案的URL:高級路由行爲與ASP.NET MVC路由

firstcolor = {VALUE1}/secondcolor = {} VALUE2

其中VALUE1和value2可以變化和動作方法像:

ProcessColors(字符串color1,字符串color2)在說一個名爲ColorController的控制器。

我想下面的路線評價:

URL '/ firstcolor =紅',結果就像ProcessColors通話( 「紅」,NULL)
URL「/ secondcolor =像ProcessColors通話blue'results (NULL,「藍」)
URL「firstcolor =紅/ secondcolor =藍色」像ProcessColors通話結束(「紅」,「藍」)現在

從我認爲這是可以用幾個可以實現路線,像這樣的東西

route.MapRoute(null, 
"firstcolor={color1}/secondcolor={color2}", 
new { controller=ColorController, action = ProcessColors }) 

route.MapRoute(null, 
"firstcolor={color1}}", 
new { controller=ColorController, action = ProcessColors, color2 = (string)null }) 

route.MapRoute(null, 
"secondcolor={color2}}", 
new { controller=ColorController, action = ProcessColors, color1 = (string)null }) 

這對於只有2種顏色就足夠了,但是據我所知,如果我們想要有4種顏色並且能夠具有這樣的URL,我們將最終獲得更多的路線:

'/firstcolor =藍/ secondcolor =紅/ thirdcolor =綠色/ fourthcolor =黑」
'/ firstcolor =藍/ thirdcolour =紅色'
'/ thirdcolour =紅/ fourthcolour =黑'

等,即我們需要迎合任何組合,因爲firstcolor將始終在2nd之前,2nd將始終在3rd之前,等等。

忽略我的荒謬例子,有沒有什麼好方法可以處理這種不涉及大量路線和動作方法的情況?

+0

不要這樣做。 =符號是根據URI RFC(http://www.ietf.org/rfc/rfc3986.txt)保留的,除非編碼,否則不應該是查詢之外的合法URI的一部分。正如çağdaş所說,使用查詢,而不是此路徑。 – 2009-10-20 13:10:13

回答

2

首先,如果你打算使用key=value格式,那麼我建議使用QueryString而不是URL。

但如果沒有,你可以這樣做:在

//register this route 
routes.MapRoute("color", "colors/processcolors/{*q}", 
    new { controller = "Color", action ="ProcessColors" }); 

那麼你ColorController

public ActionResult ProcessColors(string q) { 
    string[] colors = GetColors(q); 
    return View(); 
} 

private string[] GetColors(string q) { 
    if (String.IsNullOrEmpty(q)) { 
     return null; 
    } 
    return q.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 
} 

在這種情況下,您的網址就會是這樣的:

site.com/colors/processcolors/red 
site.com/colors/processcolors/red/green 
0

在我們使用通配符映射的情況下,我想我們失去了使用Html.ActionLink構建我們的網址對我們?

+0

你必須建立你自己的ActionLink擴展,例如ActionLinkForColors(「紅色」,「藍色」,「綠色」,「橙色」...) – 2010-06-15 09:10:44