2016-01-05 46 views
1

我認爲我的路線比他們需要的更先進。 我有幾個產品處於幾個不同的3級別類別中,但我的大多數產品都屬於2級類別。沒有產品屬於1級類別。2級或3級的MVC URL路線

因此,它是這樣的:
*貓/ SUBCAT/subSubCat /產品
*貓/ SUBCAT /產品

我想有像我的路線定義我的網址。
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個層次我想寫這個下面,但當然我得到nullrefexception 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 
}) 

那麼我需要怎麼做才能按我想要的方式獲得我的URL?也許最好是我重做我的路線?希望我給你足夠的信息。

+0

我從來不喜歡這種形式的路由。如果您使用MVC 5,請查看屬性路由(http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5。 ASPX)。更容易! –

回答

0

它看起來像你使用錯誤的路由名稱的2級網址。更改爲:

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

羅布,

這是你應該爲你的嵌套路由做的第一件事。

對於這樣的嵌套鏈接,我想你應該如下配置您的路線: -

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

你可以只繼承RouteBase,這將讓您對您的網址完全控制。一種方法是根據this answer中的主鍵進行數據庫驅動,因此只需跟蹤URL映射的主鍵即可提取產品/類別信息。

然後,當您指定一個URL時,您只需要將其主鍵包含爲id路由值,控制器和操作 - 即可。

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

請注意,您可以爲商品和單個路線分類。