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

本文关键字:3个 2个 URL 路由 由具有 MVC | 更新日期: 2023-09-27 18:29:05

我想我已经使我的路线比需要的更先进了。我有一些产品属于几个不同的三级类别,但我的大多数产品都属于二级类别。没有产品属于1级类别。

所以它是这样的:
*cat/subCat/subCat/产品
*cat/subCat/产品

我想在我的路线中定义我的URL
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 }
);

我的products类具有Category Category属性。每个Category都有一个virtual Category ParentCategory属性,该属性要么为null(一级类别),要么用其父类别填充。

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

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

但现在,如果我有2级或3级的产品,我想在下面写这篇文章,但当然,我在2级产品上得到了nullrefexception,因为它们没有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
})

那么,我需要做什么才能以我想要的方式获取URL呢?也许对我来说最好重做我的路线?希望我给了你足够的信息。

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

看起来您为二级url使用了错误的路由名称。更改为:

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

Rob,

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

对于这样的嵌套url,我认为你应该如下配置你的路由:-

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

您可以继承RouteBase,这将使您能够完全控制URL。一种选择是让它们基于主键进行数据库驱动,如本答案所示,因此您只需要跟踪主键到URL的映射,就可以提取您的产品/类别信息。

然后,当您指定一个URL时,您只需要将其主键包括为id路由值、控制器和操作——仅此而已。

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

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

 routes.MapRoute(
           name: "SubCategoryAction",
           url: "{action}/{id}/{pid}",
           defaults: new { controller = "ControllerName", action = "ActionName", id = UrlParameter.Optional ,pid= UrlParameter.Optional }
           );
//or use traditional AttributeRouting as
[AttributeRouting.Web.Mvc.Route("{action}/{id}/{pid}")]    
public ActionResult ActionName(string id,string pid){}