2011-02-01 104 views
1

這裏是URL的,我試圖用MVC3地圖如何解決這兩個衝突的MVC路由?

routes.MapRoute("Products", "{controller}/{id}/{*name}", new { action = "view" }, new { id = @"\d+" }); 

/產品/ 13/SEO友好的名稱的最產品

現在的下一個路由我需要映射是這樣的

routes.MapRoute("General", "{controller}/{id}/{action}", new { }, new { id = @"\d+" }); 

/用戶/ 42/changepassword

我想知道如何解決這個問題。僅僅改變順序是不夠的,因爲應用程序的一個區域停止工作。我知道{* name}和{action}正在發生衝突,但我不知道該如何解決此問題。

回答

4

目標是消除不明確的匹配,所以讓我們來看一個更具體的。您的產品路線控制器是否始終爲「產品」?如果是這樣,你能改變這條路線到

routes.MapRoute(
    "Products", // Route name 
    "products/{id}/{*name}", // URL with parameters 
    new { action = "view", controller="Products" }, // defaults 
    new { id = @"\d+" } // constraints 
); 
0

這個矛盾是難以解決的,只是因爲:

/products/13/seo-friendly-name-of-the-product 
/user/42/changepassword 

是相同的,它永遠是會挑請求的第一條路線。您可能需要添加一些約束條件(例如,如果catch-all值總是包含破折號,這會破壞它與其他路由的歧義性,因爲操作名稱不能包含破折號或修復控制器以執行全部捕獲路由)。