字段或 属性 \"ListItemAllFields\" 不存在异常
field or property \"ListItemAllFields\" does not exist exception
以下代码归功于 Vadim Gremyachev。我的目标是使用 CSOM
授予用户对某些 SharePoint
文件夹的访问权限。我想要实现的目标是访问名为 JZhu
的库,在 JZhu
库中,我有两个文件夹 folder1
和 folder2
。我正在尝试向 folder1
授予 Reader
权限。到目前为止,代码无法正常工作,因为我在第 6 行遇到异常:
field or property \"ListItemAllFields\" does not exist
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();
最有可能的错误是:
field or property \"ListItemAllFields\" does not exist
发生是因为您使用的 CSOM SDK 与 SharePoint 服务器版本不兼容,特别是您使用的是针对 SharePoint 2010 的 SDK 版本 15 或 16。
重点是每个 SharePoint 版本都发布了单独的 SDK:
- SharePoint Foundation 2010 Client Object Model Redistributable
目标 SharePoint 2010 Foundation/Server(版本 14)
- SharePoint Server 2013 Client Components SDK 以 SharePoint 为目标
2013(第 15 版)
- SharePoint Online Client Components SDK 以 SharePoint 为目标
在线(版本 16)
如何在 SharePoint 2010 中通过 CSOM 获取与文件夹关联的列表项
所以,如果我的假设是正确的,那么您首先需要安装 SharePoint Foundation 2010 Client Object Model Redistributable。
其次,由于 Folder class 不 在 SharePoint 2010 CSOM API 中公开 ListItemAllFields
属性,您可以利用以下方法将 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;
}
}
然后您可以为 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 中可用,以下示例演示如何将 List Item
与 Folder
相关联:
var folder = context.Web.GetFolderByServerRelativeUrl(folderUrl);
var folderItem = folder.ListItemAllFields;
以下代码归功于 Vadim Gremyachev。我的目标是使用 CSOM
授予用户对某些 SharePoint
文件夹的访问权限。我想要实现的目标是访问名为 JZhu
的库,在 JZhu
库中,我有两个文件夹 folder1
和 folder2
。我正在尝试向 folder1
授予 Reader
权限。到目前为止,代码无法正常工作,因为我在第 6 行遇到异常:
field or property \"ListItemAllFields\" does not exist
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();
最有可能的错误是:
field or property \"ListItemAllFields\" does not exist
发生是因为您使用的 CSOM SDK 与 SharePoint 服务器版本不兼容,特别是您使用的是针对 SharePoint 2010 的 SDK 版本 15 或 16。
重点是每个 SharePoint 版本都发布了单独的 SDK:
- SharePoint Foundation 2010 Client Object Model Redistributable 目标 SharePoint 2010 Foundation/Server(版本 14)
- SharePoint Server 2013 Client Components SDK 以 SharePoint 为目标 2013(第 15 版)
- SharePoint Online Client Components SDK 以 SharePoint 为目标 在线(版本 16)
如何在 SharePoint 2010 中通过 CSOM 获取与文件夹关联的列表项
所以,如果我的假设是正确的,那么您首先需要安装 SharePoint Foundation 2010 Client Object Model Redistributable。
其次,由于 Folder class 不 在 SharePoint 2010 CSOM API 中公开 ListItemAllFields
属性,您可以利用以下方法将 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;
}
}
然后您可以为 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 中可用,以下示例演示如何将 List Item
与 Folder
相关联:
var folder = context.Web.GetFolderByServerRelativeUrl(folderUrl);
var folderItem = folder.ListItemAllFields;