Есть ли способ получить объект папки из ListItem один?
Я пытаюсь получить объект папки по его пути в клиентском приложении SharePoint 2010 с использованием объектной модели на стороне клиента (.Net 4.0).
Мне нужно проверить, существует ли в библиотеке папка, описанная переменной 'folderPath', а затем получить объект Folder для дальнейших операций. Чтобы повысить производительность, я решил использовать 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();
Но в обоих случаях я получил исключение:
1-е: "Поле или свойство" Папка "не существует".
2-й: "Колонка" Папка "не существует. Возможно, он был удален другим пользователем. '
Есть ли способ сделать это? Или может я что то не так делаю? Заранее спасибо за помощь.
1 ответ
Это на самом деле зависит от того, какая версия SharePoint используется.
SharePoint 2013
В SharePoint 2013 свойство CSI ListItem.Folder получает объект папки, связанный с элементом папки.
SharePoint 2010
В SharePoint 2010 свойство папки CSOM не предоставляется объекту ListItem.
Следующий метод может быть использован для получения Folder
связаны с 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);
}
}