1

我想要基于部门名称和产品名称的自定义路由。例如 /mobiles/nokia-6303

当我调用产品页面时,它工作正常。当我在默认情况下调用其他产品页面(如主页)时,遵循控制器和操作方法正在执行

defaults: new { controller = "ContentPage", action = "ProductDetail" }

如何避免这个问题?

routes.MapRoute(
name: "ProductDetailsPage",
url: "/{DepartmentName}/{ProductName}",
defaults: new { controller = "ContentPage", action = "ProductDetail" }
);  

routes.MapRoute(
name: "Default",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);

提前感谢拉杰什

4

4 回答 4

2

你的路线完全一样。无法区分/DepartmentName/ProductName/Controller/Action。您需要在 URL 中添加其他内容以区分这两件事,例如:

routes.MapRoute(
    name: "ProductDetailsPage",
    url: "/Products/{DepartmentName}/{ProductName}",
    defaults: new { controller = "ContentPage", action = "ProductDetail" }
);  

然后导航到 /products/departmentname/productname

于 2013-09-03T10:16:52.663 回答
0

也许对 Ant P 的出色建议稍作修改,就是将文本放在部门名称和产品名称之间?

routes.MapRoute(
    name: "ProductDetailsPage",
    url: "/{DepartmentName}/Products/{ProductName}",
    defaults: new { controller = "ContentPage", action = "ProductDetail" }
); 

或者之后有详细信息:

routes.MapRoute(
    name: "ProductDetailsPage",
    url: "/{DepartmentName}/{ProductName}/details",
    defaults: new { controller = "ContentPage", action = "ProductDetail" }
); 

这些 URL 方法中的任何一种都可能通过您的“SEO 团队”,因为它在 URL 中包含了一些相关信息。

于 2013-09-03T14:00:43.843 回答
0

正如其他答案所提到的,路由系统无法区分{controller}/{action}{DepartmentName}/{ProductName}

您可以通过向路由添加约束来解决此问题。如果未满足约束,则路由将与 URL 不匹配。您可能需要创建 IRouteConstraint 的自定义实现。我看到两个选项:

  • 为 {controller}/{action} 路由创建一个约束,它将包含一个可能的控制器名称列表,应该使用默认的 URL 模式

  • 为 {DepartmentName}/{ProductName} 路由创建一个约束,它将检查数据库(或某些内存缓存)部门名称和产品名称是否与某些产品匹配

于 2013-09-04T14:00:26.870 回答
0

最后我使用路由配置本身解决了这个问题,请找到下面的代码。

foreach (var d in departmentTranslation)
{
    routes.MapRoute(
    "ContentPage" + d.Name,
    d.Name + "/{ProductName}",
    new
        {
            controller = "ContentPage",
            action = "ProductDetails",
            id = d.DepartmentId,
            ProductName = UrlParameter.Optional
        });
}
于 2013-09-10T09:44:41.763 回答