1

我想添加地圖在我的項目,但我仍然有錯誤Asp.Net的mvc 4地圖

Not all configured nodes could be paired with a parent node. Check your parent keys to ensure that a node with a corresponding key exists in the SiteMap. Note that the match is case sensitive. 

這裏是我的網站地圖

<?xml version="1.0" encoding="utf-8" ?> 
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0" 
      xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd"> 

    <mvcSiteMapNode title="Home" controller="Home" action="Index" key="Home"> 
    <mvcSiteMapNode title="Quiz" controller="Quiz" action="Index" key="Quiz" dynamicNodeProvider="SiteMapExample.Models.DynamicNodeCategory,SiteMapExample" > 

    </mvcSiteMapNode> 
    </mvcSiteMapNode> 

</mvcSiteMap> 

,這裏是我的模型,生成動態節點地圖

public class DynamicNodeCategory : DynamicNodeProviderBase 
    { 
     public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
     { 
      string[]category={".Net","Java","C"}; 
      for (int i = 0; i < 3; i++) 
      { 
       DynamicNode dNode = new DynamicNode(); 
       dNode.ParentKey = "Quiz"; 
       dNode.Title = category[i];    
       dNode.Action = "Test"; 
       dNode.Controller = "Quiz"; 
       dNode.Key = dNode.Title; 
       dNode.RouteValues.Add("category", dNode.Title); 
       yield return dNode; 
      } 
     } 
    } 

,我使用站點地圖在這裏

@Html.MvcSiteMap().SiteMapPath() 

回答

0

定義DynamicNodeProvider的mvcSiteMapNode元素未添加到站點地圖中。它只是一個定義節點。定義節點中定義的數據將成爲每個動態節點的默認值。

因此,您的配置中沒有包含關鍵「測驗」的實際節點。爲了解決這個問題,添加另一個mvcSiteMapNode來定義你的密鑰。這個額外的節點將在你的站點地圖中。

<?xml version="1.0" encoding="utf-8" ?> 
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0" 
      xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd"> 

    <mvcSiteMapNode title="Home" controller="Home" action="Index" key="Home"> 
    <mvcSiteMapNode title="Quiz" controller="Quiz" action="Index" key="Quiz"> 
     <!-- dynamic node definition --> 
     <mvcSiteMapNode controller="Quiz" action="Test" dynamicNodeProvider="SiteMapExample.Models.DynamicNodeCategory,SiteMapExample" /> 
    </mvcSiteMapNode> 
    </mvcSiteMapNode> 

</mvcSiteMap> 

如果你不想在你的站點地圖主頁下的一個額外的節點,而不是添加另一個節點指定「家」在動態節點的父項。

此外,由於您的控制器和操作已在定義節點中提供,因此您不必在動態節點提供程序中再次提供它們。你可以按照如下所示的方式來完成,或者簡單地不在定義節點上提供控制器和動作,並在這裏取消註釋這兩行 - 這將允許你在一個地方定義所有的東西。

public class DynamicNodeCategory : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    { 
     string[]category={".Net","Java","C"}; 
     for (int i = 0; i < 3; i++) 
     { 
      DynamicNode dNode = new DynamicNode(); 
      dNode.ParentKey = "Quiz"; 
      dNode.Title = category[i];  

      // Technically not needed because they are being provided by the definition node 
      // dNode.Action = "Test"; 
      // dNode.Controller = "Quiz"; 

      dNode.Key = dNode.Title; 
      dNode.RouteValues.Add("category", dNode.Title); 
      yield return dNode; 
     } 
    } 
} 

注意,它並不重要,其動態節點定義物理放置在XML文件中 - 它總是使用parentKey確定附着到哪裏的節點。

更新

如果你寧願使用[MvcSiteMapNode]屬性,你可以做同樣的事情,你會在XML。您的動態節點提供程序所聲明的節點仍然是未添加到站點地圖的定義節點,但用於定義每個動態節點的默認值。

public class QuizController : Controller 
{ 
    [MvcSiteMapNode(Title = "Quiz", Key = "Quiz")] 
    public ActionResult Index() 
    { 
     // Implemenatation here 
     return View(); 
    } 

    [MvcSiteMapNode(DynamicNodeProvider = "SiteMapExample.Models.DynamicNodeCategory,SiteMapExample")] 
    public ActionResult Test() 
    { 
     // Implemenatation here 
     return View(); 
    } 
} 

唯一的區別是控制器和動作是自動檢測到的,所以你不必指定它們。

+0

thnx爲答案先生,但我使用此屬性動態節點提供程序'[MvcSiteMapNodeAttribute(DynamicNodeProvider =「SiteMapExample.Models.DynamicNodeCategory,SiteMapExample」)]' –

+0

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