Как получить доступ к свойству Sharepoint SPNavigationNode.QuickLaunch? - PullRequest
3 голосов
/ 24 марта 2009

У меня есть сайт следующим образом:

- SiteA
---- Subsite1
---- Subsite2

Теперь, когда я пытаюсь получить доступ к свойству QuickLaunch, оно всегда пусто, например,

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

Однако если я зайду в Настройки навигации (через пользовательский интерфейс) SiteA и изменим порядок любого сайта в списке, только тогда QuickLanuch станет доступным. (Другие настройки остаются по умолчанию)

Может кто-нибудь объяснить это поведение? Мне действительно нужен доступ к элементам QuickLaunch.

Спасибо

Ответы [ 3 ]

1 голос
/ 01 сентября 2015

Эта ошибка возникает при доступе к быстрому запуску во время создания сайта. Нижний код заставляет активированный код функции ждать, пока семейство сайтов не будет создано перед выполнением.

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);
            }
    }
0 голосов
/ 24 марта 2009

Я думаю, по умолчанию QuickLaunch использует общую навигацию. Другими словами, QuickLaunch для дочернего сайта не имеет собственной коллекции узлов, пока вы что-то не сделаете с ним. Если вы переупорядочиваете сайт, это дает ему собственный уникальный набор узлов.

Если вы хотите программно настроить свой QuickLaunch так, чтобы он имел свой собственный набор узлов программно, вы должны сделать это следующим образом:

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

Я думаю, что ваш счет должен быть чем-то отличным от нуля в этой точке.

0 голосов
/ 24 марта 2009

Кажется, я помню, что где-то читал, что коллекция QuickLaunch хранит только настройки по умолчанию. Оглядываясь вокруг, я не могу найти эту документацию, чтобы показать вам, но она объяснила бы поведение, которое вы видите, если это правда.

Таким образом, ваш QuickLaunch.Count == 0 только подтверждает, что заказ товаров по умолчанию выполнен. Вы все еще можете добавить узлы, если это вообще полезно;

SPNavigationNodeCollection nodes = web.Navigation.QuickLaunch;
SPNavigationNode node = new SPNavigationNode("Node Name", "Node URL", true);
nodes.AddAsFirst(node);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...