2010-08-13 5 views
0

J'essaie d'utiliser le projet Sitemap ASP.NET MVC Codeplex avec le fournisseur de nœud dynamique personnalisé. C'est mon code de fournisseur de noeud. Il utilise un référentiel pour accéder à la base de données. En fait, je n'utilise pas DI dans cette classe, mais l'application hérite de NinjectHttpApplication et le Sitemap a des problèmes pour acquérir le contrôleur.ASP.NET MVC SiteMap avec une erreur d'usine du contrôleur 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; 
    } 
} 

Puis, en Site.master j'essaie de rendre la mie de pain comme ceci:

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

Ma route par défaut qui commence lors de l'exécution du site est la page/Affichage/{} limaces et limaces j'utiliser le « défaut », voici la Global.asax.cs partie

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

le problème que j'ai est que lorsque le fournisseur de nœud personnalisé du site est en place, je reçois cette erreur lors de l'exécution:

La valeur ne peut pas être nulle ou vide. Nom du paramètre: controllerName

Ceci est la trace de la pile (peut-être que cela aidera quelqu'un à identifier ce qui se passe). Pour autant que je sache, il va à Ninject pour le contrôleur mais n'en a pas.

[ArgumentException: La valeur ne peut pas être null ou vide. Nom du paramètre: ControllerName]
System.Web.Mvc.DefaultControllerFactory.CreateController (RequestContext RequestContext, String ControllerName) +167 Ninject.Web.Mvc.NinjectControllerFactory.CreateController (RequestContext RequestContext, String ControllerName) +151 MvcSiteMapProvider. AuthorizeAttributeAclModule.IsAccessibleToUser (IControllerTypeResolver controllerTypeResolver, fournisseur de DefaultSiteMapProvider, HttpContext contexte, noeud SiteMapNode) MvcSiteMapProvider.DefaultAclModule.IsAccessibleToUser 533 (IControllerTypeResolver controllerTypeResolver, DefaultSiteMapProvider provi der, HttpContext contexte, le noeud SiteMapNode) 149 MvcSiteMapProvider.DefaultSiteMapProvider.IsAccessibleToUser (HttpContext contexte, le noeud SiteMapNode) 24
System.Web.SiteMapNode.IsAccessibleToUser (HttpContext contexte) 17
System.Web.SiteMapProvider .ReturnNodeIfAccessible (nœud SiteMapNode ) 42
de System.Web.StaticSiteMapProvider.FindSiteMapNode (String rawUrl) 176
MvcSiteMapProvider.DefaultSiteMapProvider.FindSiteMapNode (HttpContext contexte) 282
System.Web.SiteMapProvider .get_CurrentNode() 56 MvcSiteMapProvider.Web.Html.SiteMapPathHelper.SiteMapPath (helper MvcSiteMapHtmlHelper , le séparateur String, String separatorCssClass, String linkCssClass, Boolean currentNodeAsLink, Objet htmlAttributes) 81
MvcSiteMapProvider.Web.Html. SiteMapPathHelper.SiteMapPath (MvcSiteMapHtmlHelper helper) +30
ASP.views_site_master.__Render__control1 (HtmlTextWriter __W, contrôle parameterContainer) +499

Toute aide appréciée.

Veuillez également noter que sans le fournisseur de noeud personnalisé (uniquement les noeuds statiques dans le fichier .sitemap) tout fonctionne correctement.

+0

Votre première ligne "" ne correspondra-t-elle à rien et sera-t-elle toujours utilisée? –

+0

non, l'URL vide signifie la racine. – mare

Répondre

-1

Juste une idée, mais avez-vous besoin d'ajouter le contrôleur et les valeurs d'action?

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