我认为我的路线比他们需要的更先进。 我有一些产品属于几个不同的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
})
那么我需要做什么才能按照我想要的方式获取我的网址?也许我最好重做我的路线?希望我能给你足够的信息。
答案 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){}