字段或属性\“ListItemAllFields \”不存在exception

下面的代码归功于Vadim Gremyachev。 我的目标是使用CSOM授予用户对某些SharePoint文件夹的访问权限。 我试图实现的目标是访问名为JZhu的库,在JZhu库中,我有两个文件夹folder1folder2 。 我正在尝试向folder1授予Reader权限。 到目前为止代码没有工作,因为我在第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(); 

最有可能是错误:

字段或属性\“ListItemAllFields \”不存在

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

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

  • SharePoint Foundation 2010客户端对象模型可再发行目标目标SharePoint 2010 Foundation / Server(版本14)
  • SharePoint Server 2013客户端组件SDK以SharePoint 2013(版本15)为目标
  • SharePoint Online Client组件SDK以SharePoint Online为目标(版本16)

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

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

其次,由于Folder类不公开SharePoint 2010 CSOM API中的ListItemAllFields属性,因此可以使用以下方法获取与Folder关联的ListItem

 static class ListExtensions { ///  /// Load List Item by Url ///  ///  ///  ///  public static ListItem LoadItemByUrl(this List list, string url) { var context = list.Context; var query = new CamlQuery { ViewXml = String.Format("1{0}", 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属性在SharePoint 2013 CSOM中可用,因此以下示例演示如何获取与Folder关联的List Item

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