2010-08-13 70 views
0

我想使用自定義動態節點提供程序的ASP.NET MVC Codeplex Sitemap項目。這是我的節點提供程序代碼。它使用一些存儲庫來訪問數據庫。我實際上不在這個類中使用DI,但是應用程序繼承了NinjectHttpApplication,並且Sitemap有問題獲取控制器。ASP.NET MVC的SiteMap與Ninject控制器工廠錯誤

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

我的問題是,如果自定義站點節點提供者在地方,我在運行時出現此錯誤:

值不能爲空或爲空。 參數名稱:controllerName

這是堆棧跟蹤(可能會幫助某人識別發生了什麼)。據我可以告訴它Ninject控制器,但沒有得到一個。

[ArgumentException:值不能爲 null或爲空。參數名稱: controllerName]
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext的 的RequestContext,字符串controllerName) 167 Ninject.Web.Mvc.NinjectControllerFactory.CreateController(RequestContext的 的RequestContext,字符串controllerName) 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() 56 MvcSiteMapProvider.Web.Html.SiteMapPathHelper.SiteMapPath(MvcSiteMapHtmlHelper 幫手,字符串分離器,字符串 separatorCssClass,字符串 linkCssClass,布爾 currentNodeAsLink,對象 htmlAttributes)81
MvcSiteMapProvider.Web.Html。 SiteMapPathHelper.SiteMapPath(MvcSiteMapHtmlHelper 幫手)+30
ASP.views_site_master。__Render__control1(HtmlTextWriter的 __w,控制parameterContainer)499

任何幫助理解。

另請注意,沒有自定義節點提供程序(只是.sitemap文件中的靜態節點),一切工作正常。

+0

您的第一條路線「不匹配任何東西,總是被使用? – 2010-11-26 06:31:51

+0

不,空url表示root .. – mare 2010-11-26 19:36:55

回答

-1

只是一個想法,但您是否需要添加控制器和操作值?

node.RouteValues.Add("controller", "Page"); 
node.RouteValues.Add("action", "Display");