Hej alle,
Jeg forsøger at lave mig en breacrumb ved hjælp af et SiteMap og StaticSiteMapProvider i ASP.NET. Indtil videre er det lykkedes mig at når jeg er på forsiden så bliver forsiden vist i min brødkrummesti.
Jeg benytter Umbraco som CMS og det betyder at min SiteMapProvider traverser mit indholdstræ for at kunne repræsentere den træstruktur mine sider ligger i. På forsiden virker min brødkrumme stå fint (den viser Frontpage), men når jeg bevæger mig til en underside af min forside (en child node til frontpage) får jeg at vide at CurrentNode ikke er en del af mit sitemap, selvom når jeg følger "indexeringen " så bliver den tilføjet til den interne collection.
Min SiteMapProvider ser ud som følgende
- using System;
- using System.Web;
- using CityBuilder.Model;
- using CityBuilder.WebApplication.Web.SiteMapProviders.SiteMapNodes;
- using umbraco.NodeFactory;
- using umbraco.interfaces;
-
- namespace CityBuilder.WebApplication.Web.SiteMapProviders
- {
- public class ContentSiteMapProvider : StaticSiteMapProvider
- {
- private SiteMapNode _rootSiteMapNode;
- private readonly object _lock = new object();
-
- protected override SiteMapNode GetRootNodeCore()
- {
- return BuildSiteMap();
- }
-
- public override SiteMapNode BuildSiteMap()
- {
- if (_rootSiteMapNode == null)
- {
- lock(_lock)
- {
- if (_rootSiteMapNode != null)
- return _rootSiteMapNode;
-
- base.Clear();
-
- INode umbracoRootNode;
- _rootSiteMapNode = AddUmbracoRootNode(out umbracoRootNode);
-
- AddNode(_rootSiteMapNode);
- AddChildren(umbracoRootNode, _rootSiteMapNode);
- }
- }
-
- return _rootSiteMapNode;
- }
-
- private void AddChildren(INode umbracoNode, SiteMapNode parentNode)
- {
- foreach (var node in umbracoNode.ChildrenAsList)
- {
- if (node.NodeTypeAlias.Equals(NodeTypeAlias.Site, StringComparison.OrdinalIgnoreCase))
- {
- var currentNode = new SiteSiteMapNode(this, node);
-
- AddNode(currentNode, parentNode);
- AddChildren(node, currentNode);
- }
- else if (node.NodeTypeAlias.Equals(NodeTypeAlias.Frontpage, StringComparison.OrdinalIgnoreCase))
- {
- var currentNode = new FrontpageSiteMapNode(this, node);
-
- AddNode(currentNode, parentNode);
- AddChildren(node, currentNode);
- }
- else if (node.NodeTypeAlias.Equals(NodeTypeAlias.Contentpage, StringComparison.OrdinalIgnoreCase))
- {
- var currentNode = new ContentpageSiteMapNode(this, node);
-
- AddNode(currentNode, parentNode);
- AddChildren(node, currentNode);
- }
- }
- }
-
- private SiteMapNode AddUmbracoRootNode(out INode umbracoRootNode)
- {
- INode node = new Node(-1);
-
- umbracoRootNode = node;
- return new RootSiteMapNode(this, node);
- }
- }
- }
Min adapter til udskrivning af brødkrummestien:
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls.Adapters;
- using CityBuilder.WebApplication.Web.SiteMapProviders;
- using CityBuilder.WebApplication.Web.SiteMapProviders.SiteMapNodes;
-
- namespace CityBuilder.WebApplication.Presentation.UserControls
- {
- public class SiteMapProviderAdapter : WebControlAdapter
- {
- protected override void RenderContents(HtmlTextWriter writer)
- {
- var siteMapPath = Control as CityBuilderSiteMapPath;
-
- if (siteMapPath == null)
- throw new InvalidOperationException("Control is not of type CityBuilderSiteMapPath");
-
- var provider = ((CityBuilderSiteMapPath) (Control)).Provider as ContentSiteMapProvider;
-
- if (provider == null)
- throw new InvalidOperationException("Could not find a ContentSiteMapProvider.");
-
- var current = provider.CurrentNode;
-
- if (current == null)
- throw new InvalidOperationException("Current page is not part of the SiteMap.");
-
- var siteMapNodesStack = new Stack<SiteMapNode>();
-
- while (current != null)
- {
- siteMapNodesStack.Push(current);
-
- current = current.ParentNode;
- }
-
- foreach (PageSiteMapNode siteMapNode in siteMapNodesStack)
- {
- writer.RenderBeginTag("ul");
- writer.RenderBeginTag(HtmlTextWriterTag.Li);
-
- writer.AddAttribute(HtmlTextWriterAttribute.Href, siteMapNode.Url);
- writer.RenderBeginTag("a");
- writer.Write(siteMapNode.NavigationTitle);
- writer.RenderEndTag();
-
- writer.RenderEndTag();
- writer.RenderEndTag();
-
- Debug.Write("Dette er kun for test.");
- }
- }
- }
- }
Det irreterer mig grænseløst efterhånden hvorfor den påstår den ikke er en del af mit sitemap, når det ser ud til den bliver tilføjet korrekt. Nogen der har nogle forslag?
EditSkal lige også nævne at min provider er registret i web.config'en.
Eksempel på min egen SiteMapNode type
- using System.Web;
- using umbraco.interfaces;
-
- namespace CityBuilder.WebApplication.Web.SiteMapProviders.SiteMapNodes
- {
- public class SiteSiteMapNode : PageSiteMapNode
- {
- public SiteSiteMapNode(SiteMapProvider siteMapProvider, INode node)
- : base(siteMapProvider, node)
- {
- }
- }
- }
- using System;
- using System.Collections;
- using System.Collections.Specialized;
- using System.Web;
- using CityBuilder.Model;
- using CityBuilder.WebApplication.Core.Umbraco.Extensions;
- using umbraco.interfaces;
-
- namespace CityBuilder.WebApplication.Web.SiteMapProviders.SiteMapNodes
- {
- public abstract class PageSiteMapNode : SiteMapNode
- {
- public PageSiteMapNode(SiteMapProvider siteMapProvider, INode node)
- : base(siteMapProvider, node.NiceUrl)
- {
- Initialize(node);
- }
-
- #region Obsolete constructors
-
- [Obsolete("Use parameter that contains INode instead.")]
- private PageSiteMapNode(SiteMapProvider provider, string key)
- : base(provider, key)
- {
- }
-
- [Obsolete("Use parameter that contains INode instead.")]
- private PageSiteMapNode(SiteMapProvider provider, string key, string url)
- : base(provider, key, url)
- {
- }
-
- [Obsolete("Use parameter that contains INode instead.")]
- private PageSiteMapNode(SiteMapProvider provider, string key, string url, string title)
- : base(provider, key, url, title)
- {
- }
-
- [Obsolete("Use parameter that contains INode instead.")]
- private PageSiteMapNode(SiteMapProvider provider, string key, string url, string title, string description)
- : base(provider, key, url, title, description)
- {
- }
-
- [Obsolete("Use parameter that contains INode instead.")]
- private PageSiteMapNode(SiteMapProvider provider, string key, string url, string title, string description, IList roles, NameValueCollection attributes,
- NameValueCollection explicitResourceKeys, string implicitResourceKey)
- : base(provider, key, url, title, description, roles, attributes, explicitResourceKeys, implicitResourceKey)
- {
- }
-
- #endregion
-
- private void Initialize(INode node)
- {
- NavigationTitle = node.GetPropertyValue(PropertyName.NavigationTitle) ?? node.Name;
- Title = node.GetPropertyValue(PropertyName.PageTitle) ?? node.Name;
- Url = node.NiceUrl;
- }
-
- public string NavigationTitle { get; set; }
- }
- }
Indlæg senest redigeret d. 07.10.2012 18:42 af Bruger #6559