SharePoint - 客户端对象模型 - 获取子文件夹项

4
每个 “listItem” 包含了项目,如何获取它们?我试了一段时间但是一直失败。
寻求帮助,谢谢。
CamlQuery 来自于一些来自网络的测试和例子,但并没有帮到我(已经尝试过多次修改)。
            ClientContext clientContext =  new ClientContext("http://xxx.xxx.com");
            List list = clientContext.Web.Lists.GetById(new Guid("{F91A0F26-2826-4B3B-AF30-ED7DE4494C7B}"));
            clientContext.Load(list);

            clientContext.ExecuteQuery();
            CamlQuery camlQuery = new CamlQuery();
            camlQuery.ViewXml = @"<queryOptions><QueryOptions><ViewAttributes Scope='RecursiveAll'/><Folder></Folder></QueryOptions></queryOptions>";
            ListItemCollection listItems = list.GetItems(camlQuery);
            clientContext.Load(listItems);
            clientContext.ExecuteQuery();

            foreach (ListItem listItem in listItems)
            {
              each lisItem has children/items , how to get them?!

            }
3个回答

12
我已经找到答案了,感谢所有的帮助者... :) Items 是我创建的对象。 如果你遍历上面的foreach中的文件夹,可以通过(string)listItem ["FileRef"]获取"folderServerRelativeUrl"的值。
  public Items GetFolderItems(string folderServerRelativeUrl, List list, ClientContext clientContext)
        {
            try
            {
                var result = new Items();  <-- my class
                var query = new CamlQuery();

                query.FolderServerRelativeUrl = folderServerRelativeUrl;

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

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

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

                return result;
            }
            catch (Exception)
            {
                return null;
            }
        }

3

获取列表文件夹中所有项的另一种方法:

camlQuery.ViewXml = @"<View Scope='RecursiveAll'>
                         <Query>
                            <Where>
                                <Eq>
                                   <FieldRef Name='FSObjType' />
                                   <Value Type='int'>0</Value>
                                 </Eq>
                             </Where>
                          </Query>
                       </View>";

1
感谢您提供这个很棒的答案。只是想让您知道,folderServerRelativeUrl变量应该来自根URL(除了http://server)。我确实在documentcenter内有一个名为“Vendors”的列表。也就是说,siteUrl是http://server/documentcenter,列表名称为Vendors。我必须传递“/documentcenter/Vendors/…”作为我的folderServerRelativeUrl。但没关系,我仍然非常感激您。

Stack Overflow的朋友们,很遗憾我无法在他的答案下面添加评论。我不得不将此评论作为答案提交。如果可以以不同的方式完成,请帮助我。我不想编辑他的答案。

~Sharmin


请阅读常见问题解答 - 它会解释何时可以发表评论。提示:您只需要再获得一个声望点即可。 - kleopatra
@kleopatra,感谢您的提示。但我仍然认为一个普通用户,尤其是新手,在StackOverflow上不应该等到获得一些声望才能发表评论。另一个不知道这一点的用户会来看我的答案,而真正的答案在下面。 - user007
@SharminJose; 这是一个UI问题。UI的存在是为了与用户进行交互;如果有问题,UI应该提示。对于新用户,“添加评论”按钮应该可见,并在单击后显示有关声望不足的消息。要求每个用户阅读并完全理解FAQ是有效的,但有简单的方法来引导用户到那里,而不是让一万个愤怒的StackExchange用户一直吠叫“RTF”。@kleopatra,我不是在说你;你非常优雅。 - Naikrovek
@Naikrovek,我只是想说应该允许任何人输入评论。对我来说,当任何人都可以输入答案,但只有声望才允许用户输入评论时,这看起来很奇怪。我只是不想编辑其他用户的答案,但肯定想添加上述消息。再次强调,这只是我的愿望,我并不是说我完美地传达了它。顺便问一下,“RTF”是什么意思? - user007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接