Карта сайта ASP.NET MVC с ошибкой фабрики контроллера Ninject - PullRequest
0 голосов
/ 13 августа 2010

Я пытаюсь использовать проект 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 я использую «По умолчанию», вот часть 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: значение не может быть нулевым или пустым.Имя параметра: controllerName]
System.Web.Mvc.DefaultControllerFactory.CreateController (RequestContext requestContext, String controllerName) +167 Ninject.Web.Mvc.NinjectControllerFactory.CreateController (RequestContext requestContetoTaseTimeStateTextStateTimeStateText)IControllerTypeResolver controllerTypeResolver, поставщик DefaultSiteMapProvider, HttpContext контекст, SiteMapNode узел) поставщик +533 MvcSiteMapProvider.DefaultAclModule.IsAccessibleToUser (IControllerTypeResolver controllerTypeResolver, DefaultSiteMapProvider, HttpContext контекст, SiteMapNode узел) +149 MvcSiteMapProvider.DefaultSiteMapProvider.IsAccessibleToUser (HttpContext контекст, SiteMapNode узел) + 24
System.Web.SiteMapNode.IsAccessibleToUser (контекст HttpContext) + 17
System.Web.SiteMapProvider.ReturnNodeIfAccessible (узел SiteMapNode) + 42
System.Web.StaticSiteMapProvider.FindSiteCapWider221PlayPlay21Nap221PlayPlay2121SignPlayWN21WNW2NeWNAP.DEFaultSiteMapProvider.FindSiteMapNode (HttpContext контекст) + 282
System.Web.SiteMapProvider.get_CurrentNode (): +56 MvcSiteMapProvider.Web.Html.SiteMapPathHelper.SiteMapPath (MvcSiteMapHtmlHelper помощник, строка разделитель, строка separatorCssClass, Строка linkCssClass, булева currentNodeAsLink, объект htmlAttributes) + 81
MvcSiteMapProvider.Web.Html..

Также обратите внимание, что без специального провайдера узлов (только статические узлы в файле .sitemap) все работает нормально.

1 Ответ

0 голосов
/ 26 ноября 2010

Просто мысль, но нужно ли вам добавлять значения контроллера и действия?

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