感谢您阅读我的问题。
以下情况:
-一个基于自定义内容类型的sharepoint列表。内容类型只不过是一个带有一些额外属性(如url、targetpage)的文件夹。-文件夹内容类型和项表示菜单结构。例如:
Home | www.home.com | Home。aspx
--> Subhome | www.subhome.com | Subhome。aspx
Impressum | www.impressum.com | Impressum。aspx
这个结构没有深度限制,也不限制它可以包含多少项/文件夹。唯一的限制是,在一个文件夹内,每个名称必须是唯一的。
由于性能问题,我需要一次获取列表中的所有项,而不是每个文件夹。我是这样做的:
SPQuery qry = new SPQuery();
qry.ViewAttributes = "Scope='RecursiveAll'";
之后,我将SPListItems转换为一个名为NavigationEntry的对象。该节点包含一个SiteMapNode和一些其他属性,如路径,itemname和levelcount(例如Home/Subhome = level2, Impressum = level1)。
现在我用path+itemname作为键将所有这些项目放入字典中(因为它是唯一的,并且给了我一个项目所在位置的提示)。之后,我使用linq访问这个字典,并获取每个关卡的项目,直到到达最后(关卡中没有可用的项目)。现在到了棘手的部分。我必须将这个奇怪的结构"转换"成sharpoint的导航结构。因为我是sharepoint的新手,所以有时这有点令人困惑。
此刻我通过水平和SiteMapNodeCollections创建SiteMapNodes,去到下一个级别,看看是否已经存在的父项,把孩子到它等等。这是可行的,但它非常复杂、肮脏和脆弱。
是否有"简单"或更结构化的方法来解决这个问题?我不是在寻找一个已经编码的解决方案,但任何提示到正确的方向上如何解决这个问题。谢谢你!:)
如果只是一个导航树是你想要的,我可以推荐jtree
我曾经将它用于多级Quichnav Delegate。虽然我创建了一个Manage Interface来添加项目,但您可以在List的Change Events中构造XML或Json。或者更花哨一点,每次扩展节点时执行一次查询。
希望有帮助
Lars