0

我在 asp.net mvc 项目中定义了以下路由

//Products/Category/SubCategory/Page 
routes.MapRoute(
    "ProductCategoryTypePaging", 
    "Products/{Category}/{subCategory}/Page{page}", 
    new { controller = "Products", action = "Index" }, new { page = @"\d+" }
);

//Products/Category/Page 
routes.MapRoute(
    "ProductCategoryPaging", 
    "Products/{Category}/Page{page}", 
    new { controller = "Products", action = "Index" }, new { page = @"\d+" }
);

//Products/Category/SubCategory 
routes.MapRoute(
    "ProductCategoryType", 
    "Products/{Category}/{subCategory}", 
    new { controller = "Products", action = "Index", page = 1 }
);

//Products/Category 
routes.MapRoute(
    "ProductCategory", 
    "Products/{Category}", 
    new { controller = "Products", action = "Index" }
);


routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

这些似乎工作正常,但如果我尝试查看产品详细信息,它就会中断。要查看详细信息,Url 是这样的:

/产品/详情/18

在 Products/Category/SubCategory 路线上运行匹配

我需要做些什么不同的事情来完成这项工作?

4

1 回答 1

0

有多种方法可以做到这一点:

  1. 将路由的静态部分更改为不同,例如将 Products/Category/SubCategory 路由更改为具有以下模板(或类似的唯一模板):“ProductCategory/{Category}/{subCategory}”
  2. 将约束添加到仅允许有效类别的同一路由,并允许非类别的事物通过。

根本问题是这个应用程序中的路由结构不明确。如果有一个名为“详细信息”的类别有一个名为“18”的子类别,您会期望发生什么?它应该映射哪条路线?

在我上面列出的选项 #2 的脉络中,您可以添加到类别/子类别路由的约束将是例如 RegEx 约束,它不允许类别名称为“详细信息”。这将导致路由被跳过,但它也会阻止应用程序拥有一个名为“详细信息”的类别。如果该应用程序没问题,它应该可以正常工作。

于 2013-02-28T18:20:03.763 回答