如何解决这两个冲突的MVC路由?

时间:2011-02-01 21:49:14

标签: asp.net-mvc asp.net-mvc-routing

以下是我试图用MVC3映射的URL

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}存在冲突,但我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:4)

目标是消除模棱两可的匹配,所以让我们看一下更具体的一个。您的产品路线的控制器始终是“产品”吗?如果是这样,您可以将该路线更改为

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

答案 1 :(得分:0)

这种冲突很难解决,因为:

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

是相同的,它将始终是第一个选择请求的路由。您可能需要设置一些约束(例如,说catch-all值将始终包含破折号,这将使其与其他路径消除歧义,因为动作名称不能包含破折号或修复控制器以获取全部捕获路径。)< / p>