c# - 有没有办法从 ListItem 中获取 Folder 对象?

标签 c# sharepoint-2010 caml sharepoint-clientobject

我正在尝试使用客户端对象模型 (.Net 4.0) 通过其在 SharePoint 2010 客户端应用程序中的路径获取文件夹对象。

我需要检查'folderPath'变量描述的文件夹是否存在于库中,然后获取文件夹对象以进行进一步的操作。为了提高性能,我选择使用 CAML 查询来过滤列表。

我的代码:

IEnumerable<List> library = this.clientContext.LoadQuery(
    this.clientContext.Web.Lists.Where(p => p.Title == this.documentLibrary));
this.clientContext.ExecuteQuery();
List libraryList = library.FirstOrDefault();
//code to handle libraryList == null

CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml =
   "<View Scope=\"RecursiveAll\">" +
       "<Query>" +
           "<Where>" +
               "<And>" +
                   "<Eq>" +
                      "<FieldRef Name=\"FSObjType\"/>" +
                      "<Value Type=\"Integer\">1</Value>" +
                   "</Eq>" +
                   "<Eq>" +
                      "<FieldRef Name=\"FileRef\" />" +
                      "<Value Type=\"Text\">" + folderPath + "</Value>" +
                   "</Eq>" +
               "</And>" +
           "</Where>" +
       "</Query>" +
   "</View>";

ListItemCollection items = libraryList.GetItems(camlQuery);
clientContext.Load(items);
clientContext.ExecuteQuery();

至此一切正常。但我不知道如何从项目中获取“文件夹”对象。我试过这样做:

Folder folder = items.FirtsOrDefault().Folder;
clientContext.Load(folder);
clientContext.ExecuteQuery();

这样(而不是第一个代码片段的最后三行):

ListItemCollection items = libraryList.GetItems(camlQuery);
clientContext.Load(items, collection => collection.Include(item => item.Folder));
clientContext.ExecuteQuery();

但在这两种情况下我都遇到了异常:

第一个:“字段或属性‘文件夹’不存在。”

第二:“文件夹”列不存在。它可能已被其他用户删除。'

有办法吗?或者我做错了什么?预先感谢您的帮助。

最佳答案

这实际上取决于所使用的 SharePoint 版本。

SharePoint 2013

在 SharePoint 2013 CSOM 中 ListItem.Folder property获取与文件夹项关联的文件夹对象。

SharePoint 2010

在 SharePoint 2010 中,CSOM 文件夹属性公开 ListItem对象。

以下方法可用于检索与 ListItem 关联的 Folder:

/// <summary>
/// Get Parent Folder for List Item
/// </summary>
/// <param name="listItem"></param>
/// <returns></returns>
private static Folder GetListItemFolder(ListItem listItem)
{
    var folderUrl = (string)listItem["FileDirRef"];
    var parentFolder = listItem.ParentList.ParentWeb.GetFolderByServerRelativeUrl(folderUrl);
    listItem.Context.Load(parentFolder);
    listItem.Context.ExecuteQuery();
    return parentFolder;
}

例子:

using (var context = new ClientContext(webUrl))
{
      var list = context.Web.Lists.GetByTitle(listTitle);
      var items = list.GetItems(CamlQuery.CreateAllItemsQuery());
      context.Load(items);
      context.ExecuteQuery();


      foreach (var item in items)
      {
         var folder = GetListItemFolder(item); //get Folder
         Console.WriteLine(folder.Name);
      }
}

关于c# - 有没有办法从 ListItem 中获取 Folder 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22401996/

相关文章:

sharepoint - 可以在 Caml 查询上使用聚合函数吗?

jquery - 对另一个 SharePoint 列表中的列中的项目进行计数

c# - 将 XML 反序列化为对象 C#

sharepoint - 以编程方式设置 SharePoint 网站的默认组

sharepoint - 在SharePoint 2010中运行Move-SPSite移动网站集时出错

sharepoint - 使用 CAML 查询大型外部列表

c# - 使用 EigenObjectRecognizer

c# - 返回玩家组合的有效方法

c# - Google API OAuth 2.0 服务帐户 C# 第一次与每天使用

web-parts - 包含可视 Web 部件的已部署解决方案未显示在自定义类别中