【问题标题】:Cannot create a folder in a SharePoint Online List无法在 SharePoint Online 列表中创建文件夹
【发布时间】:2019-08-01 09:43:08
【问题描述】:

上一个问题:here 被我们英勇又讨厌的版主关闭,他们冲进来标记所有错误,但是一旦您对其进行编辑以满足他们的异常需求,就没有人投票重新打开它,因为他们已经尽了自己的一份力...

那么请有人解释一下,如何在 SharePoint Online 列表中正确创建文件夹?

我尝试先使用 C# SDK 创建它,但没有成功。

var folder = new DriveItem
{
Name = plan.Title,
Folder = new Folder()
};

await graphServiceClient
.Sites["ourdomain.sharepoint.com:/sites/ITOddeleni:"]
.Lists["Planner"]
.Drive
.Root
.Children
.Request()
.AddAsync(folder);

然后我开始使用 Graph Explorer,找到文件夹的 ContentType ID 并尝试将其创建为指定 ContentType 的项目。

这是 JSON 请求标头,导致在列表中创建文件夹,但它没有名称,因为文件夹在 SharePoint 中的行为与项目不同。

{
"Title" : "Test2",
"contentType": { "id": "0x012000FC4989A03C9F7845AD8C206E2F47A0FD" }
}

我尝试更改“名称”、“FileLeafRef”的“标题”以及任何可能是标题的文件夹内部名称,但无法弄清楚。它接受了所有的请求头,但创建的文件夹的名称仍然是空白的。

感谢任何帮助。

编辑:

我已经尝试了 Vadim 的建议,并且确实创建了该文件夹,乍一看,它似乎带有您在代码中指定的名称。但它也带有一些生成的名称,请参见图片右侧。

打开文件夹后,您的名字就会丢失,直到您刷新文件夹所在级别的页面。这是打开文件夹时的样子。

我也尝试在标题之外添加名称/名称,但它返回 小写和大写的“消息:无法识别字段'名称'”。

【问题讨论】:

  • 显示您尝试的每个选项如何失败会很有用。假设有问题的列表是一个文档库,C# 示例应该可以工作。
  • 如果它是一个文档库,我会说它是文档库,这只是一个列表。 C# 代码返回:代码:-1,Microsoft.SharePoint.Client.ResourceNotFoundException 消息:找不到请求的资源 Microsoft.FileServices.FileService/Sites('50cb05fa-27f9-45bf-a5f3-5f82e0e2eb00')/lists('ad52e785- c9b7-4106-af7b-a3394462875c')/drive/.
  • Graph Explorer 中调用了其他方法,没有返回错误,但创建的文件夹没有名称。因为我将它创建为指定 contentType 的项目。

标签: c# microsoft-graph-api sharepoint-online microsoft-graph-sdks


【解决方案1】:

您是否考虑过 CSOM 或者它不是一个选项? SharePoint 在线最佳选择是使用 CSOM PnP nuget link

代码应如下所示:


    try
    {
        string siteUrl = "SiteUrl";
        AuthenticationManager authManager = new AuthenticationManager();
        using (ClientContext context = authManager.GetWebLoginClientContext(siteUrl))
        {
            List list = context.Web.Lists.GetByTitle("LibName");
            context.Load(list);
            context.ExecuteQuery();
            Folder folder = list.RootFolder.CreateFolder("NewFolder");
        }
    }
    catch (Exception ex)
    {
        // log error
        throw;
    }

我已经用一些控制台应用程序测试了上面的代码,就我而言,结果是

希望对你有帮助:)

【讨论】:

  • 您好 Adam,感谢您的建议,但这应该只是 Graph 项目,因为它应该能够以某种方式创建文件夹... :-) 一定有办法
【解决方案2】:

List 中的文件夹可以通过Create item endpoint 创建,如下所示:

POST https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items
Content-Type: application/json

{
  "fields": {
    "Title": "Folder name goes here",
  },
  "contentType": { "id": "0x0120" }
}

在哪里

  • 标题等文件夹属性通过ListItem.Fields property指定
  • 要创建文件夹类型的项目,需要明确指定contentType 属性设置为0x0120

C# 示例

var folderItem = new ListItem
{
    ContentType = new ContentTypeInfo()
       {
           Id = "0x0120"
       },
       Fields = new FieldValueSet()
               {
                    AdditionalData = new Dictionary<string,object>
                    {
                        {
                            "Title", folderName
                        }
                    }
                }
};

await graphClient
       .Sites.Root
       .Lists["<list name or id>"]
       .Items
       .Request()
       .AddAsync(folderItem);

【讨论】:

  • 您好 Vadim,感谢您的回复 :-) 文件夹已创建,但问题来了。最初它看起来很好,创建了文件夹,它具有指定的名称,但是一旦你打开文件夹,它的名称在我的情况下转换为“3163_.000”并保持这种状态,直到我刷新页面时它带有名称直到我点击它...奇怪。查看编辑。
  • @MarekKyzivát,事实上,FileLeafRef 似乎是按照以下格式创建的 &lt;ItemId&gt;_.000..
猜你喜欢
  • 2017-11-04
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
相关资源
最近更新 更多