2010-08-13 5 views
0

ASP.NET MVC Codeplex 사이트 맵 프로젝트를 사용자 정의 동적 노드 공급자와 함께 사용하려고합니다. 이것은 노드 공급자 코드입니다. DB에 액세스하기 위해 일부 저장소를 사용합니다. 실제로이 클래스에서는 DI를 사용하지 않지만 응용 프로그램은 NinjectHttpApplication을 상속받으며 Sitemap에는 컨트롤러를 획득하는 데 문제가 있습니다. Ninject 컨트롤러가있는 ASP.NET MVC SiteMap 팩토리 오류

public class ContentPageDynamicNodeProvider : DynamicNodeProviderBase 
{ 
    private IRepository _repository; 

    public override IEnumerable<DynamicNode> GetDynamicNodeCollection() 
    { 
     // Build value 
     var returnValue = new List<DynamicNode>(); 

     // Create a node for each content page 
     _repository = new XmlDefaultRepository(ContentType.Page); 
     foreach(var page in _repository.GetInstances()) 
     { 
      DynamicNode node = new DynamicNode(); 
      node.Title = page.Title; 
      node.ParentKey = "Default"; 
      node.RouteValues.Add("slug", page.Slug); 
      returnValue.Add(node); 
     } 

     // Return 
     return returnValue; 
    } 
} 

그런 다음 Site.Master에서 나는이 같은 빵 부스러기를 렌더링하려고 : 사이트를 실행할 때 시작

<%=Html.MvcSiteMap().SiteMapPath() %> 

내 기본 경로는 페이지/디스플레이/{슬러그}이고 슬러그 내가 사용

: "기본은"여기 global.asax.cs 부분 내가 가진 문제는 사용자 지정 사이트 노드 제공자가 제자리에있을 때 내가 런타임에이 오류가 있다는 것입니다

 routes.MapRoute(
      "DefaultPage", RouteType.Regular, 
      "", 
      new { controller = "Page", action = "Display", slug = "Default" }, null 
      ); 

     routes.MapRoute(
      "PageBySlug", RouteType.Regular, 
      "{slug}", 
      new { controller = "Page", action = "Display", slug = "Default" }, null 
      ); 

     routes.MapRoute(
      "Default", RouteType.Regular, 
      "{controller}/{action}/{slug}", 
      new { controller = "Page", action = "Display", slug = "Default" }, null 
      ); 

입니다

값은 null 또는 비워 둘 수 없습니다. 매개 변수 이름 : controllerName

이것은 스택 추적입니다. 누군가가 무슨 일이 일어나는지 식별하는 데 도움이됩니다. 내가 아는 한 컨트롤러 용 Ninject로 이동하지만 컨트롤러를 얻지는 못한다.

[ArgumentException : 값을 null 또는 비워 둘 수 없습니다. 매개 변수 이름 : 컨트롤러 명]
System.Web.Mvc.DefaultControllerFactory.CreateController (RequestContext requestContext, 문자열 컨트롤러 명) 167 Ninject.Web.Mvc.NinjectControllerFactory.CreateController (RequestContext requestContext, 문자열 컨트롤러 명) 151 MvcSiteMapProvider. AuthorizeAttributeAclModule.IsAccessibleToUser (IControllerTypeResolver controllerTypeResolver, DefaultSiteMapProvider 제공자 HttpContext를 컨텍스트 SiteMapNode 노드) 533 MvcSiteMapProvider.DefaultAclModule.IsAccessibleToUser (IControllerTypeResolver controllerTypeResolver, DefaultSiteMapProvider에 있습니다 provi DER, HttpContext를 컨텍스트 SiteMapNode 노드) 149 MvcSiteMapProvider.DefaultSiteMapProvider.IsAccessibleToUser (HttpContext를 컨텍스트 SiteMapNode 노드) +24
System.Web.SiteMapNode.IsAccessibleToUser (HttpContext를 컨텍스트) +17
System.Web.SiteMapProvider .ReturnNodeIfAccessible (SiteMapNode 노드) +42
System.Web.StaticSiteMapProvider.FindSiteMapNode (문자열 rawUrl) 176
MvcSiteMapProvider.DefaultSiteMapProvider.FindSiteMapNode (HttpContext를 컨텍스트) 282
System.Web.SiteMapProvider .get_CurrentNode() MvcSiteMapProvider.Web.Html.SiteMapPathHelper.SiteMapPath +56 +81
MvcSiteMapProvider.Web.Html을 (MvcSiteMapHtmlHelper 헬퍼 문자열 세퍼레이터 문자열 separatorCssClass 문자열 는 linkCssClass 부울 currentNodeAsLink, htmlAttributes 개체). SiteMapPathHelper.SiteMapPath (MvcSiteMapHtmlHelper 도우미) +30
ASP.views_site_master.__Render__control1 (HtmlTextWriter입니다 __w, 제어 parameterContainer) 499

어떤 도움에 감사드립니다.

또한 사용자 정의 노드 공급자 (.sitemap 파일의 정적 노드 만)가 없으면 모든 것이 올바르게 작동합니다.

+0

첫 번째 경로는 무엇이든 일치하며 항상 사용되지 않습니까? –

+0

아니요 빈 URL은 루트를 의미합니다. – mare

답변

-1

컨트롤러와 동작 값을 추가해야합니까?

node.RouteValues.Add("controller", "Page"); 
node.RouteValues.Add("action", "Display"); 
관련 문제