字段或属性“ ListItemAllFields”不存在异常

OPK*_*OPK 1 c# permissions sharepoint sharepoint-clientobject

下面的代码感谢Vadim Gremyachev。我的目标是使用授予用户对某些SharePoint文件夹的访问权限CSOM。我试图实现的目标是访问称为的库JZhu,在JZhu库内部,我有两个文件夹folder1和folder2。我正在尝试向授予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();
Run Code Online (Sandbox Code Playgroud)

Vad*_*hev 5

最有可能的错误:

字段或属性“ ListItemAllFields”不存在

发生这种情况是因为您使用的是与SharePoint服务器版本不兼容的 CSOM SDK,尤其是针对SharePoint 2010使用的SDK版本是15或16。

关键是针对每个SharePoint版本已经发布了单独的SDK:

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

因此,如果我的假设正确,那么您首先需要安装SharePoint Foundation 2010客户端对象模型可再发行组件。

其次,由于文件夹类并没有暴露ListItemAllFields在SharePoint 2010物业API CSOM,你可以利用用于获取相关的下列方法ListItem具有Folder:

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;
    }
}  
Run Code Online (Sandbox Code Playgroud)

然后,您可以为设置唯一的权限,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();
Run Code Online (Sandbox Code Playgroud)

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

由于Folder.ListItemAllFields属性在SharePoint 2013 CSOM中可用,因此以下示例演示如何与List Item关联Folder:

var folder = context.Web.GetFolderByServerRelativeUrl(folderUrl);
var folderItem = folder.ListItemAllFields;
Run Code Online (Sandbox Code Playgroud)