带有Ninject控制器工厂错误的ASP.NET MVC SiteMap

时间:2010-08-13 09:18:07

标签: asp.net-mvc asp.net-mvc-2 sitemap ninject

我正在尝试将ASP.NET MVC Codeplex Sitemap项目与自定义动态节点提供程序一起使用。这是我的节点提供程序代码。它使用一些存储库来访问数据库。我实际上不在这个类中使用DI,但是应用程序继承了NinjectHttpApplication,并且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() %>

运行站点时启动的默认路由是Page / Display / {slug},对于slug,我使用“Default”,这里是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或空。参数名称:   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,   DefaultSiteMapProvider提供程序,   HttpContext上下文,SiteMapNode节点)   +533 MvcSiteMapProvider.DefaultAclModule.IsAccessibleToUser(IControllerTypeResolver   controllerTypeResolver,   DefaultSiteMapProvider提供程序,   HttpContext上下文,SiteMapNode节点)   +149 MvcSiteMapProvider.DefaultSiteMapProvider.IsAccessibleToUser(HttpContext   context,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   helper,String separator,String   separatorCssClass,String   linkCssClass,Boolean   currentNodeAsLink,Object   htmlAttributes)+81
  MvcSiteMapProvider.Web.Html.SiteMapPathHelper.SiteMapPath(MvcSiteMapHtmlHelper   帮助者)+30
  ASP.views_site_master .__ Render__control1(HtmlTextWriter的   __w,Control parameterContainer)+499

任何帮助表示感谢。

另请注意,如果没有自定义节点提供程序(只是.sitemap文件中的静态节点),一切正常。

1 个答案:

答案 0 :(得分:-1)

只是想一想,但是你需要添加控制器和动作值吗?

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