2011-02-01 100 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值总是包含破折号,这会破坏它与其他路由的歧义性,因为操作名称不能包含破折号或修复控制器以执行全部捕获路由)。