如何访问Sharepoint SPNavigationNode.QuickLaunch属性?

时间:2009-03-24 04:22:35

标签: sharepoint

我有一个网站如下:

- 站点A
---- subsite1的
---- Subsite2

现在每当我尝试访问QuickLaunch属性时,它总是空的,例如

SPNavigation nav = spWeb.Navigation;
if (nav.QuickLaunch.Count == 0)
{
      // ALWAYS TRUE
}

但是,如果我进入SiteA的导航设置(通过UI)并重新排序列表中的任何网站,那么QuickLanuch才会可用。 (其他设置保留为默认值)

任何人都可以解释这种行为吗?我真的需要访问QuickLaunch项目。

由于

3 个答案:

答案 0 :(得分:1)

如果在创建网站时访问快速启动,则会发生此错误。下面的代码会导致功能激活的代码等到执行之前创建网站集。

using System.Threading;


public override void FeatureActivated(SPFeatureReceiverProperties properties)
    {
        //Queues changes until after site exists.  For use in provisioning.
        SPWeb web = properties.Feature.Parent as SPWeb;
        ThreadPool.QueueUserWorkItem(ApplyYourChanges, web.Url);
    }

private void ApplyYourChanges(object state)
    {
        string webUrl = state as string;
        Uri uri = new Uri(webUrl);

        // additional conditions here -- perhaps check if a feature was activated
        while (!SPSite.Exists(uri))
        {
            Thread.Sleep(5000);
        }
        using (SPSite site = new SPSite(webUrl))
        {
            using (SPWeb web = site.OpenWeb())
            {
                //configure the quicklaunch menu
                configureQuickLaunch(web);
            }
        }
    }

public static void configureQuickLaunch(SPWeb spWeb)
    {            
        SPNavigationNodeCollection nodeCollection = spWeb.Navigation.QuickLaunch;
        SPNavigationNode heading = nodeCollection.Cast<SPNavigationNode>().FirstOrDefault(n => n.Title == headingNode);
        SPNavigationNode item = heading.Children.Cast<SPNavigationNode>().FirstOrDefault(n => n.Url == url);
            if(item == null)
            {
                item = new SPNavigationNode(nodeName, url);
                item = heading.Children.AddAsLast(item);
            }
    }

答案 1 :(得分:0)

我似乎记得在某处读取QuickLaunch集合仅将自定义存储到默认排序。环顾四周,我无法找到向您展示的文档,但它会解释您看到的行为是否属实。

因此,您的QuickLaunch.Count == 0只是确认项目的默认排序已到位。 您仍然可以添加节点,如果这些都有帮助的话;

SPNavigationNodeCollection nodes = web.Navigation.QuickLaunch;
SPNavigationNode node = new SPNavigationNode("Node Name", "Node URL", true);
nodes.AddAsFirst(node);

答案 2 :(得分:0)

我认为默认情况下,QuickLaunch使用共享导航。换句话说,子站点的QuickLaunch在您使用它之前没有自己的节点集合。如果您重新排序网站,则会为其提供自己唯一的节点集。

如果您想以编程方式将QuickLaunch设置为拥有自己的节点集,那么您应该能够这样做:

SPNavigation nav = spWeb.Navigation;  
nav.UseShared = false;  
spWeb.Update();  

我认为你的计数在那时应该是零以外的东西。