SharePoint CSOM - 加载HasUniqueRoleAssignment始终失败

时间:2016-09-12 14:11:27

标签: sharepoint csom

我越来越困惑,因为我做错了。我之前做了很多次,但不确定为什么这次不工作。这是一个代码;

dynamic fileOrFolder;
if (model.IsFolder)
    fileOrFolder = _clientContext.Web.GetFolderByServerRelativeUrl(serverRelativeUrl);
else
    fileOrFolder = _clientContext.Web.GetFileByServerRelativeUrl(serverRelativeUrl);

我在下面尝试了ALL但没有任何效果;

_clientContext.Load(fileOrFolder, item => item.Include(file => file.ListItemAllFields));

dynamic blhasUniquePermission = fileOrFolder.ListItemAllFields.HasUniqueRoleAssignments;

OR

_clientContext.Load(fileOrFolder.ListItemAllFields.HasUniqueRoleAssignments);

OR

_clientContext.Load(fileOrFolder.ListItemAllFields,
    items => items.Include(
        item => item.Id,
        item => item.DisplayName,
        item => item.HasUniqueRoleAssignments));

OR

_clientContext.Load(fileOrFolder.ListItemAllFields, "Include(HasUniqueRoleAssignments)");
_clientContext.ExecuteQuery();

每次它立即在Load行本身或ExecuteQuery上抛出错误。我们deffo知道ListItemAllFields集合中有属性,那为什么要这样做呢?

1 个答案:

答案 0 :(得分:0)

看起来您使用dynamic关键字来破解C#,让您创建fileOrFolder变量并存储其中两个不相关类型之一的实例。

不仅奇怪,而且通过这样做,你也使智能感知和编译器瘫痪。

采取这一行:

_clientContext.Load(fileOrFolder, item => item.Include(file => file.ListItemAllFields));

它可能会在运行时抛出,因为IncludeMicrosoft.SharePoint.Client.File类型都没有Microsoft.SharePoint.Client.Folder方法。如果您没有使用dynamic,则会收到明确的编译错误。

这一个:

_clientContext.Load(fileOrFolder.ListItemAllFields.HasUniqueRoleAssignments);

不起作用,因为_clientContext.Load采用Microsoft.SharePoint.Client.ClientObject的实例。但同样,编译器并不知道参数是什么,因为它来自动态对象。在编辑器中没有红色波浪形,而是出现运行时错误。

这应该有效:

ListItem itemAndOnlyItem = null;
if (model.IsFolder)
{
    var folder = _clientContext.Web.GetFolderByServerRelativeUrl(serverRelativeUrl);
    itemAndOnlyItem = folder.ListItemAllFields;
}
else
{
    var file = _clientContext.Web.GetFileByServerRelativeUrl(serverRelativeUrl);
    itemAndOnlyItem = file.ListItemAllFields;
}

_clientContext.Load(itemAndOnlyItem,
    item => item.HasUniqueRoleAssignments);
_clientContext.ExecuteQuery();

var result = itemAndOnlyItem.HasUniqueRoleAssignments;