具有2或3个级别的MVC URL路由

时间:2016-01-05 14:43:47

标签: c# asp.net-mvc routes

我认为我的路线比他们需要的更先进。 我有一些产品属于几个不同的3级别类别,但我的大部分产品都属于2级别。没有产品属于1级别。

所以它是这样的:
* cat / subCat / subSubCat / products
* cat / subCat / products

我希望在我的路线中定义我的网址 2索引:../Shop/Sortiment/cat/subCat
2详细信息:../Shop/Sortiment/cat/subCat/product/1/name
3索引:../Shop/Sortiment/cat/subCat/subSubCat
3详细信息:../Shop/Sortiment/cat/subCat/subSubCat/product/2/name

routes.MapRoute(
    name: "CategoryIndex",
    url: "Shop/Sortiment/{category}/{subCategory}/{subSubCategory}",
    defaults: new { controller = "Sortiment", action = "Index", subCategory= UrlParameter.Optional, subSubCategory = UrlParameter.Optional }
);
routes.MapRoute(
    name: "ProductDetails",
    url: "Shop/Sortiment/{category}/{subCategory}/{subSubCategory}/product/{id}/{productName}",
    defaults: new { controller = "Sortiment", action = "Details", subSubCategory = UrlParameter.Optional, productName = UrlParameter.Optional }
);

我的产品类有Category Category属性。每个Category都有一个virtual Category ParentCategory属性,该属性为null(第一级别类别)或填充了它的父类别。

对于2级产品,我可以写这样的链接(在我的路线中没有subSubCategory):

@Url.RouteUrl("ProductDetails", new
{
    category = item.Category.ParentCategory.Name,
    subCategory = item.Category.Name,
    id = item.ID,
    productName = item.Name
})

但是现在如果我有2级或3级产品我想在下面写这个,但是当然我对2级产品没有反感,因为他们没有2 ParentCategory

@Url.RouteUrl("ProductDetails", new
{
    category = item.Category.ParentCategory.ParentCategory.Name,
    subCategory = item.Category.ParentCategory.Name,
    subSubCategory = item.Category.Name,
    id = item.ID,
    productName = item.Name
})

那么我需要做什么才能按照我想要的方式获取我的网址?也许我最好重做我的路线?希望我能给你足够的信息。

4 个答案:

答案 0 :(得分:0)

看起来您正在为2级网址使用错误的路径名称。改为:

@Url.RouteUrl("CategoryIndex", new
{
category = item.Category.ParentCategory.Name,
subCategory = item.Category.Name,
id = item.ID,
productName = item.Name
})

答案 1 :(得分:0)

罗布,

这是您应该为嵌套路由做的第一件事。

对于这样的嵌套网址,我认为你应该按如下方式配置你的路由: -

 routes.MapRoute(
            name: "ProductDetails",
            url: "shop/{*subCategory }",
            defaults: new { controller = "Sortiment", action = "Details", subCategory = UrlParameter.Optional }
        );

答案 2 :(得分:0)

您可以继承RouteBase,这样您就可以完全控制自己的网址。一种选择就是根据this answer中的主键使数据库驱动,因此您只需要跟踪URL映射的主键,以便提取产品/类别信息。

然后,当您指定URL时,您只需要将其主键包含为id路由值,控制器和操作 - 这就是全部。

@Html.Action("Details", "CustomPage", new { id = 1234 })

请注意,您可以拥有一条产品路线和一条路线。

答案 3 :(得分:0)

 routes.MapRoute(
           name: "SubCategoryAction",
           url: "{action}/{id}/{pid}",
           defaults: new { controller = "ControllerName", action = "ActionName", id = UrlParameter.Optional ,pid= UrlParameter.Optional }
           );

//And access it from controller as

[AttributeRouting.Web.Mvc.Route("{action}/{id}/{pid}")]    
public ActionResult ActionName(string id,string pid){}