Я пытаюсь использовать проект 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) все работает нормально.