我有一个网站如下:
- 站点A
---- subsite1的
---- Subsite2
现在每当我尝试访问QuickLaunch属性时,它总是空的,例如
SPNavigation nav = spWeb.Navigation;
if (nav.QuickLaunch.Count == 0)
{
// ALWAYS TRUE
}
但是,如果我进入SiteA的导航设置(通过UI)并重新排序列表中的任何网站,那么QuickLanuch才会可用。 (其他设置保留为默认值)
任何人都可以解释这种行为吗?我真的需要访问QuickLaunch项目。
由于
答案 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();
我认为你的计数在那时应该是零以外的东西。