ASP SitemapPath Not rendering correctly
Since there is no longer a breadcrumb control in sitefinity 4.0 i made a quick custom control that is just has an asp sitemappath in it. There are two issues i am running in to.
1) no matter what the current node does not get rendered on the page. I found that it is not putting anything between the <a></a> tags for the current node, the href part is rendered fine but there is no text
2) In both firefox and safari the links are not clickable, IE is fine both 7 and 8. I found this to be true in 3.7's breadcrumb control as well.
Thx
Michael
Hello Michael,
Can you try using this control
<asp:SiteMapPath runat="server" ID="SiteMapPath1" RenderCurrentNodeAsLink="true" PathSeparator=">" ></asp:SiteMapPath>I tried it in a blank template, and it works to render the links as clickable, so i'm thinking i might have something off in my css for the masterpage.
But i still have the problem of the Current Node Not Being Rendered.
Hi Michael,
Can you show the code you use? My code above renders all nodes and includes the current one.
Regards,
Ivan Dimitrov
the Telerik team
sure... Mine has some custom stuff to it, but i tried it with the code you posted above and it behaves the same way for me.
i made a user control called Breadcrubs.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Breadcrumbs.ascx.cs" Inherits="SitefinityWebApp.Controls.Breadcrumbs" %><asp:SiteMapPath runat="server" ID="SiteMapPath1" RenderCurrentNodeAsLink="true" PathSeparator=">" ></asp:SiteMapPath>using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace SitefinityWebApp.Controls public partial class Breadcrumbs : System.Web.UI.UserControl protected void Page_Load(object sender, EventArgs e) protected override void OnInit(EventArgs e) base.OnInit(e); SiteMapPath1.SkipLinkText = String.Empty; SiteMapPath1.ItemCreated += new SiteMapNodeItemEventHandler(Breadcrumb_ItemCreated); protected void Breadcrumb_ItemCreated(object sender, SiteMapNodeItemEventArgs e) //hide the root node, and it's following path separator if (e.Item.ItemIndex == 0 | (e.Item.ItemIndex == 1 && e.Item.ItemType == SiteMapNodeItemType.PathSeparator)) e.Item.Visible = false; Hello Michael,
I checked the control with a local project and the current node was rendered correctly at my end. I do not see any problem with this code. There is some other logic that breaks it. Also, this is the standard ASP.NET SiteMapPath control which just added on a page ( without any server side code) displays all nodes properly.
Regards,
Ivan Dimitrov
the Telerik team
Hi,
Hello Neil,
Pages is the StartingNode of the SiteMap. If you use the code above where Michael subscribes for Breadcrumb_ItemCreated, you cannot see Page, because it is explicitly hidden. I am sending you a short video. This is the standard ASP.NET control and of course there could be some improvements to it.
Greetings,
Ivan Dimitrov
the Telerik team
Thanks Ivan,
I queried the breadcrumb in 3.7 and was pointed to adapters, the adapter implemented does not work in 4 and fails at collection.Add(node) value cannot be null.
protected override void RenderContents(HtmlTextWriter writer) writer.Indent++; SiteMapPath item = (SiteMapPath)Control; SiteMapProvider Provider = ((System.Web.UI.WebControls.SiteMapPath)(Control)).Provider; SiteMapNodeCollection collection = new SiteMapNodeCollection(); SiteMapNode node = Provider.CurrentNode; if (node != null) collection.Add(node); while (node != Provider.CurrentNode.RootNode) node = node.ParentNode; collection.Add(node); BuildItems(collection, true, writer); writer.Indent--; writer.WriteLine(); [ArgumentNullException: Value cannot be null. Parameter name: value] System.Web.SiteMapNodeCollection.Add(SiteMapNode value) +2186483 SitefinityWebApp.Widgets.Page.SiteMapPathAdapter.RenderContents(HtmlTextWriter writer) in C:\DEV\Coffey\Widgets\Page\SiteMapPathAdapter.cs:76 System.Web.UI.WebControls.Adapters.WebControlAdapter.Render(HtmlTextWriter writer) +32 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +8863183 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 System.Web.UI.Control.Render(HtmlTextWriter writer) +10 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 System.Web.UI.Control.Render(HtmlTextWriter writer) +10 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer) +173 System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer) +31 System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output) +53 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer) +40 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 System.Web.UI.Control.Render(HtmlTextWriter writer) +10 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 Telerik.Web.UI.RadAjaxPage.Render(HtmlTextWriter writer) +55 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3060 Hi Neil,
It is failing at this line most probably:
if (node != null) collection.Add(node); while (node != Provider.CurrentNode.RootNode) node = node.ParentNode; collection.Add(node); SiteMapNode currentNode = SiteMapBase.GetCurrentProvider().CurrentNode;Hello,
I'm also having the same problem where the current node is not being rendered. On all pages and subpages, Telerik.Sitefinity.Web.PageSiteNode.Title is an empty string.
As for setting the root node text to "Home", I'm reverting to:
void smp_Breadcrumbs_ItemCreated(object sender, SiteMapNodeItemEventArgs e) if ((e.Item.ItemType == SiteMapNodeItemType.Root) && (e.Item.Controls.Count > 0)) if (e.Item.Controls[0] is HyperLink) ((HyperLink)e.Item.Controls[0]).Text = "Home"; Hi Ed,
You have to use an instance of PageNode which has a property Page.Title which is the name of the page.
var pageNode = _SiteMapNode as PageSiteNode;var pn = man.GetPageNode(pageNode.Id);So, this is how I accomplished changing the root "Pages" text to "Home", in addition to rendering the current node...
void smp_Breadcrumbs_ItemCreated(object sender, SiteMapNodeItemEventArgs e) if ((e.Item.ItemIndex == 0) && (e.Item.ItemType == SiteMapNodeItemType.Root) && (e.Item.Controls.Count > 0)) if (e.Item.Controls[0] is HyperLink) ((HyperLink)e.Item.Controls[0]).Text = "Home"; ((HyperLink)e.Item.Controls[0]).ToolTip = ""; else if (e.Item.ItemType == SiteMapNodeItemType.Current) if (e.Item.Controls[0] is Literal) Telerik.Sitefinity.Web.PageSiteNode pageSiteNode = (Telerik.Sitefinity.Web.PageSiteNode)e.Item.SiteMapNode; Telerik.Sitefinity.Modules.Pages.PageManager manager = new Telerik.Sitefinity.Modules.Pages.PageManager(); Telerik.Sitefinity.Pages.Model.PageNode pageNode = manager.GetPageNode(pageSiteNode.Id); ((Literal)e.Item.Controls[0]).Text = pageNode.Title.Value; thx ed. That worked for me.
Does anyone else's Home link display twice when they are actually on the Home page using this code?
I get a linked Home and then an unlinked Home...almost like it's not recognizing that it's at the root level.
Hi
I am getting Home twice..
do you know how to fix it?
Thanks,