4

我目前使用的MvcSiteMapProvider由似乎無法得到MvcSiteMapProvider與具有

@Html.MvcSiteMap().SiteMapPath() 

我的網站動態生成麪包屑我爲我是所有品牌的路線值的路由,而第一個值工作在URL中包含了品牌,所以我會將所有看起來像這樣:

routes.MapRoute("Terms", "{brand}/Terms", new { controller = "Legal", Action = "Terms" }); 
routes.MapRoute("Privacy", "{brand}/Privacy", new { controller = "Legal", Action = "Privacy" }); 
routes.MapRoute("Home", "{brand}", new { controller = "Home", action = "Dashboard" }); 
routes.MapRoute("Dashboard", "{brand}/Dashboard", new { controller = "Home", action = "Dashboard" }); 

這在以前的版本有所合作,但我看到了間歇性的問題與兩個不同的品牌觀看相同的路線。一旦我更新了,我現在一無所獲。

我的網站地圖看起來是這樣的:

<mvcSiteMapNode title="Home" url="/{brand}" route="Home"> 
    <mvcSiteMapNode title="Dashboard" url="/{brand}/Dashboard" route="Dashboard" /> 
    <mvcSiteMapNode title="Terms" url="/{brand}/Terms" route="Terms" /> 
    <mvcSiteMapNode title="Privacy" url="/{brand}/Privacy" route="Privacy" /> 
    </mvcSiteMapNode> 

我已經通過了更新文檔挖,並試圖一噸的不同的東西。我已經將源代碼包含在我的項目中並進行了調試,而且我唯一能看到的是無論我做什麼,currentNode都始終爲空。

任何想法?

回答

3

url屬性/屬性用於配置具有絕對路徑的URL,不用於配置路由。當您使用url屬性時,它基本上會禁用節點上的路由支持,並將其轉換爲基於URL的節點。這對於與ASP.NET的互操作性或在您的SiteMap中提供外部鏈接很方便。你的Url不匹配,因爲它們不是真正的URL,這是預期的。

要在節點上使用MVC路由,基本上必須按照配置ActionLink或RouteLink(與可選路由屬性一起使用時)的方式配置它們。

<mvcSiteMapNode title="Home" controller="Home" action="Dashboard" route="Home"> 
    <mvcSiteMapNode title="Dashboard" action="Dashboard" route="Dashboard" /> 
    <mvcSiteMapNode title="Terms" controller="Legal" action="Terms" route="Terms" /> 
    <mvcSiteMapNode title="Privacy" controller="Legal" action="Privacy" route="Privacy" /> 
</mvcSiteMapNode> 

另外,在使用XML配置時,面積和控制器屬性將自動從最後定義他們的祖先節點,這可以節省你一些繁重的工作繼承。而且,路線完全是可選的。

<mvcSiteMapNode title="Home" controller="Home" action="Dashboard"> 
    <mvcSiteMapNode title="Dashboard" action="Dashboard" /> 
    <mvcSiteMapNode title="Terms" controller="Legal" action="Terms" /> 
    <mvcSiteMapNode title="Privacy" controller="Legal" action="Privacy" /> 
</mvcSiteMapNode> 

但是使用自定義路由參數會變得棘手。請參閱this answer以瞭解如何完成該操作。

更新

我又看看你的配置,我想我已經發現了問題。您沒有將節點配置爲考慮品牌參數,因此它們將永遠不匹配。如果(正如我懷疑的那樣)你試圖讓所有品牌都與這一組節點相匹配,那麼你需要添加「品牌」作爲其保留的路徑參數來強制它匹配。

<mvcSiteMapNode title="Home" controller="Home" action="Dashboard" preservedRouteParameters="brand"> 
    <mvcSiteMapNode title="Dashboard" action="Dashboard" preservedRouteParameters="brand"/> 
    <mvcSiteMapNode title="Terms" controller="Legal" action="Terms" preservedRouteParameters="brand"/> 
    <mvcSiteMapNode title="Privacy" controller="Legal" action="Privacy" preservedRouteParameters="brand"/> 
</mvcSiteMapNode> 

這會導致當前請求的品牌在比較之前被複制到節點的RouteValues中。要獲得匹配,您需要在節點的RouteValues中具有與當前請求的RouteValues中相同的鍵和值(值不區分大小寫)。如果你不這樣做,currentNode將始終爲空。

它以前似乎可以工作的原因是因爲v4.4.x在URL上也是匹配的,這是導致無效匹配發生的錯誤。

有一個完整的文章詳細介紹了匹配工作的標題是How to Make MvcSiteMapProvider Remember a User's Position

更新2

我還注意到,您的默認值未設置就在您的路線。由於路由密鑰區分大小寫,因此「操作」應該是「操作」。

// This is what you have 
routes.MapRoute("Terms", "{brand}/Terms", new { controller = "Legal", Action = "Terms" }); 
routes.MapRoute("Privacy", "{brand}/Privacy", new { controller = "Legal", Action = "Privacy" }); 

// Action should always be lowercase (action) 
routes.MapRoute("Terms", "{brand}/Terms", new { controller = "Legal", action = "Terms" }); 
routes.MapRoute("Privacy", "{brand}/Privacy", new { controller = "Legal", action = "Privacy" }); 
+0

謝謝。我試着用10種不同的方式來配置節點上的'Url'屬性。最初,在更新之前,我使用了Controller,Action,並根據需要使用Route。更新後根本沒有工作。我現在使用的是DynamicNodeProvider,但我正在使用正確的層次結構來處理它。 –

+0

請建立一個小型的演示項目,並將其發佈到GitHub上或將其壓縮並提供下載,然後[開啓新的問題](https://github.com/maartenba/MvcSiteMapProvider/issues?state=open)。有幾件不同的事情發生了變化,這可能是問題的根源,我想嘗試確定發生的事情。 – NightOwl888

+0

@JeffSheldon - 我更新了我的答案。 – NightOwl888