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呢?也许对我来说最好重做我的路线?希望我给了你足够的信息。
看起来您为二级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){}