有没有一种方法可以从ListItem获取Folder对象? [英] Is there a way to get Folder object from ListItem one?

查看:87
本文介绍了有没有一种方法可以从ListItem获取Folder对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用客户端对象模型(.Net 4.0)在SharePoint 2010客户端应用程序中按其路径获取Folder对象.

I'm trying to get Folder object by its path in SharePoint 2010 client application using Client Side Object Model (.Net 4.0).

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

I need to check whether folder described by 'folderPath' variable exists in the library and then get the Folder object for further operations. To enhance performance, I chose to use CAML query to filter the list.

我的代码:

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();

到目前为止,一切正常.但是我不知道如何从项目中获取文件夹"对象.我试图通过这种方式做到这一点:

To this point everything is OK. But I don't have any idea how get the 'Folder' object from an item. I tried to do it in this way:

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

并以此方式(而不是使用第一个代码段的后三行):

and that way (used instead of last three lines from first code snippet):

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

但是在两种情况下我都遇到了例外:

But in both cases I got an Exception:

第一个:字段或属性文件夹"不存在."

1st: 'Field or property 'Folder' does not exist.'

2nd:列"文件夹不存在.它可能已被其他用户删除.'

2nd: 'Column 'Folder' does not exist. It may have been deleted by another user.'

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

Is there a way to do it? Or maybe I'm doing something wrong? Thanks in advance for the help.

推荐答案

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

It actually depends on which version of SharePoint is used.

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

In SharePoint 2013 CSOM ListItem.Folder property gets a folder object that is associated with a folder item.

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

The following method could be used for retrieving Folder associated with ListItem:

/// <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);
      }
}

这篇关于有没有一种方法可以从ListItem获取Folder对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆