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> 

오히려 다른 노드가 동적 노드에 부모 키로 "홈"을 지정 추가하는 대신, 홈 페이지 아래에 맵에 추가 노드를 원하지 않는 경우.

또한 컨트롤러와 동작이 이미 정의 노드에 제공되므로 동적 노드 공급자에서 컨트롤러와 동작을 다시 제공 할 필요가 없습니다. 아래에 나와있는 것처럼이 작업을 수행하거나 정의 노드에서 컨트롤러와 작업을 제공하지 않고 여기에있는 두 줄의 주석 처리를 제거하면 모든 것을 한 곳에서 정의 할 수 있습니다. 동적 노드 정의가 물리적으로 XML 파일에 배치되는 위치는 중요하지 않습니다

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; 
     } 
    } 
} 

주 - 항상 어디에 노드를 연결하는 결정하기 위해 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

대답은 snx이지만 동적 노드 공급자에 대해이 속성을 사용하고 있습니다. [MvcSiteMapNodeAttribute (DynamicNodeProvider = "SiteMapExample.Models.DynamicNodeCategory, SiteMapExample")] ' –

+0

@AbhishekSingh - 답변을 업데이트했습니다. – NightOwl888