1

好的 - 我创建了一个继承PortalSiteMapProvider的自定义导航提供程序,并且我正在尝试通过 GetChildNodes 方法扩展我的类(此处为简单示例)。

本质上,我要做的是将当前 SPWeb 的 SiteLogoUrl 字符串添加为每个 SPWeb 各自 SiteMapNode 的属性(称为 imgurl),以便稍后在我的自定义菜单控件(继承 SharePoint:AspMenu)中检索此值。

我在 GetChildNodes 下的提供程序中设置了这样的属性:

public override SiteMapNodeCollection GetChildNodes(SiteMapNode node)
    {
        PortalSiteMapNode portalNode = (PortalSiteMapNode)node;
        if (portalNode != null)
        {
            if (portalNode.Type == NodeTypes.Area)
            {
                SiteMapNodeCollection nodeColl = base.GetChildNodes(portalNode);

                using (SPSite currentSite = new SPSite(portalNode.PortalProvider.CurrentSite.Url))
                {
                    foreach (SiteMapNode topLevelNode in nodeColl)
                    {
                        foreach(SiteMapNode currentNode in topLevelNode.ChildNodes)
                        {
                            string currentWebUrl = currentNode.Url.Substring(0, currentNode.Url.ToLower().IndexOf("/pages/"));
                            using (SPWeb currentWeb = currentSite.OpenWeb(currentWebUrl))
                            {
                                if (!string.IsNullOrEmpty(currentWeb.SiteLogoUrl))
                                {
                                    currentNode["imgurl"] = currentWeb.SiteLogoUrl;
                                }
                            }                            
                        }
                    }
                }

                return nodeColl;
            }

现在我可以调试它并在插入后检索值(x 是节点的索引,我在命令行窗口中执行此操作):

? topLevelNode.ChildNodes[x]["imgurl"]

并返回图片的url:“/_layouts/images/myimage.jpg”

现在..当我尝试在我的自定义菜单控件中执行此操作时,我首先获得了我的自定义导航提供程序的句柄,如下所示:

                CustomNavProvider customProvider = (CustomNavProvider)SiteMap.Providers["CustomNavProvider"];
                SiteMapNode currentNode = customProvider.FindSiteMapNode(childitem.NavigateUrl);

并且 currentNode 变量现在包含我的 SiteMapNode ......很棒,但是现在只有一个名为“AlternateUrl”的属性,而不是我之前添加的属性 - 我在提供程序中添加的 imgurl 属性现在已经消失了。所有其他属性,如 title、desc 等都在那里,所以它肯定会返回正确的节点。

我这里有什么问题?当我将属性添加到提供程序中的节点时,是否没有保留该属性?

任何帮助或建议表示赞赏。

4

0 回答 0