gpt4 book ai didi

sharepoint - 使用 CSOM 从特定 SharePoint 2013 库获取所有子文件夹

转载 作者:行者123 更新时间:2023-12-04 02:04:29 26 4
gpt4 key购买 nike

如何使用 CSOM 从特定的 SharePoint 库 中获取所有子文件夹的列表?当用户单击“选择文件夹”时,我想提供与 SharePoint 中相同的功能。

enter image description here

我找到了这篇文章 CAML and the Client Object Model我认为这很好,但是当我尝试以下操作时出现错误:

using (ClientContext clientContext = new ClientContext(this.SpSite))
{
var web = clientContext.Web;
var list = web.Lists.GetByTitle('Contracts');

var query = new CamlQuery();
query.FolderServerRelativeUrl = "/Contracts";
query.ViewXml = "<View Scope='RecursiveAll'>"
+ "<Query>"
+ " <Where>"
+ " <Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value></Eq>"
+ " </Where>"
+ "</Query>"
+ "</View>";

var folderItems = list.GetItems(query);
clientContext.Load(folderItems);
clientContext.ExecuteQuery();

foreach (ListItem item in folderItems)
{
// item[ "..." ];
}
}

我也尝试了不同的 CALM 查询但无济于事:

query.ViewXml = "<View Scope=\"RecursiveAll\"> " +
"<Query>" +
"<Where>" +
"<Eq>" +
"<FieldRef Name=\"FileDirRef\" />" +
"<Value Type=\"Text\">" + title + "</Value>" +
"</Eq>" +
"</Where>" +
"</Query>" +
"</View>";

如有任何帮助,我们将不胜感激。

谢谢。

UPDATE-1:

我发现了一个问题 How to traverse SharePoint Library in Client Object Model?StackExchange 上询问这非常接近我的需要,但仍然有几个问题:

  1. 它使用递归,这意味着如果您有很多关卡,它最终会创建大量请求并且可能会显示非常慢。

  2. 返回的数据未排序。根据我提供的快照,它没有返回 01、02、03 等...而是以随机顺序返回值。

我希望我能够进行一次调用并获得所有文件夹和子文件夹的列表,但我想这最终也会很耗时。

我想我有几个选择:

  1. 贴上递归的方法,弄清楚如何整理数据,但我还需要弄清楚后者。

  2. 只请求顶层文件夹,当文件夹展开时只请求子文件夹。理想情况下,如果使用此方法,最好知道文件夹是否有任何子文件夹,这意味着还必须弄清楚这一点。

到达那里,但还没有完全到达那里。

因此,如果有人可以向我提供额外的反馈、片段等任何内容,请提供。

谢谢。

最佳答案

对于一次加载所有文件夹的情况,我建议进行以下调整:

因为 CSOM API 已经包含 the built in method就此而言,加载所有文件夹项目可以像这样执行:

var folderItems = list.GetItems(CamlQuery.CreateAllFoldersQuery());

其次,我建议从关联的列表项中检索文件夹对象:

var allFolders = folderItems.Select(i => i.Folder).ToList();

例子:

public static List<Folder> GetAllFolders(List list)
{
var ctx = list.Context;
var folderItems = list.GetItems(CamlQuery.CreateAllFoldersQuery());
ctx.Load(folderItems, icol => icol.Include(i => i.Folder));
ctx.ExecuteQuery();
var allFolders = folderItems.Select(i => i.Folder).ToList();
return allFolders;
}

由于整个文件夹结构的加载从性能角度来看可能是一个瓶颈,为避免这种情况,您可以考虑按需加载方法:

加载表单后,检索1st 级文件夹列表并填充 TreeView :

var list = ctx.Web.Lists.GetByTitle(libraryTitle);
var folders = FolderManager.GetFolders(list.RootFolder);

var rootNode = new TreeNode(libraryTitle);
folderSelector.Nodes.Add(rootNode);
foreach (var folder in folders)
{
var folderNode = new TreeNode(folder.Name) {Tag = folder};
rootNode.Nodes.Add(folderNode);
}

然后在触发 expand 事件后按需加载子文件夹并填充节点:

private void folderTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
if (e.Node.Level > 0 ) //skip root level
{
var folders = FolderManager.GetFolders((Folder)e.Node.Tag);
foreach (var folder in folders)
{
var folderNode = new TreeNode(folder.Name) { Tag = folder };
e.Node.Nodes.Add(folderNode);
}
}
}

在哪里

public static List<Folder> GetFolders(Folder parentFolder)
{
var ctx = parentFolder.Context;
var result = ctx.LoadQuery(parentFolder.Folders.Where(f => !f.ListItemAllFields.ServerObjectIsNull.Value));
ctx.ExecuteQuery();
return result.ToList();
}

关于sharepoint - 使用 CSOM 从特定 SharePoint 2013 库获取所有子文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44550318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com