【问题标题】:field or property \"ListItemAllFields\" does not exist exception字段或属性“ListItemAllFields”不存在异常
【发布时间】:2015-06-30 02:17:08
【问题描述】:

以下代码归功于 Vadim Gremyachev。我的目标是使用CSOM 授予用户对某些SharePoint 文件夹的访问权限。我想要实现的目标是访问名为JZhu 的库,在JZhu 库中,我有两个文件夹folder1folder2。我正在尝试将Reader 权限授予folder1。到目前为止,代码不起作用,因为我在第 6 行遇到异常:

字段或属性“ListItemAllFields”不存在

 ClientContext context = new ClientContext("http://myRealUrl");
 Principal user = context.Web.EnsureUser(@"myLoginAccout");
 var folder = context.Web.GetFolderByServerRelativeUrl("JZhu/folder1");
 var roleDefinition = context.Site.RootWeb.RoleDefinitions.GetByType(RoleType.Reader);  //get Reader role
 var roleBindings = new RoleDefinitionBindingCollection(context) { roleDefinition };
 folder.ListItemAllFields.BreakRoleInheritance(true, false);  //line 6
 folder.ListItemAllFields.RoleAssignments.Add(user, roleBindings);
 context.ExecuteQuery();

【问题讨论】:

    标签: c# sharepoint permissions sharepoint-clientobject


    【解决方案1】:

    很可能是错误:

    字段或属性“ListItemAllFields”不存在

    由于您使用的 CSOM SDK 与 SharePoint 服务器版本不兼容,特别是您使用的是针对 SharePoint 2010 的 SDK 版本 15 或 16。

    关键是每个 SharePoint 版本都发布了单独的 SDK:

    如何在 SharePoint 2010 中通过 CSOM 获取与文件夹关联的列表项

    所以,如果我的假设是正确的,那么你首先需要安装SharePoint Foundation 2010 Client Object Model Redistributable

    其次,由于Folder class 确实在 SharePoint 2010 CSOM API 中公开ListItemAllFields 属性,因此您可以使用以下方法将ListItemFolder 关联起来:

    static class ListExtensions
    {
        /// <summary>
        /// Load List Item by Url 
        /// </summary>
        /// <param name="list"></param>
        /// <param name="url"></param>
        /// <returns></returns>
        public static ListItem LoadItemByUrl(this List list, string url)
        {
            var context = list.Context;
            var query = new CamlQuery
            {
                ViewXml = String.Format("<View><RowLimit>1</RowLimit><Query><Where><Eq><FieldRef Name='FileRef'/><Value Type='Url'>{0}</Value></Eq></Where></Query></View>", url),
            };
            var items = list.GetItems(query);
            context.Load(items);
            context.ExecuteQuery();
            return items.Count > 0 ? items[0] : null;
        }
    }  
    

    然后您可以为Folder 设置唯一权限,如下所示:

    Principal user = ctx.Web.EnsureUser(accountName);
    var list = ctx.Web.Lists.GetByTitle(listTitle);
    var folderItem = list.LoadItemByUrl(folderUrl);
    var roleDefinition = ctx.Site.RootWeb.RoleDefinitions.GetByType(RoleType.Reader);  //get Reader role
    var roleBindings = new RoleDefinitionBindingCollection(ctx) { roleDefinition };
    folderItem.BreakRoleInheritance(true, false);  //line 6
    folderItem.RoleAssignments.Add(user, roleBindings);
    ctx.ExecuteQuery();
    

    如何在 SharePoint 2013 中通过 CSOM 获取与文件夹关联的列表项

    由于 Folder.ListItemAllFields property 在 SharePoint 2013 CSOM 中可用,以下示例演示如何获取与 Folder 关联的 List Item

    var folder = context.Web.GetFolderByServerRelativeUrl(folderUrl);
    var folderItem = folder.ListItemAllFields;
    

    【讨论】:

    • 这周我下班了,所以我没有办法测试它。我会在周一测试,测试后接受答案。
    • 旧帖子,但我今天遇到了这个问题:LoadItemByUrl 是一个很好的方法,但是作为一个改进,用 替换 也可以获取子文件夹
    猜你喜欢
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多