Я создаю API с ASP.NET Core, который обращается к списку/диску с помощью графического API, и в какой-то момент мне нужно обновить элемент, созданный в библиотеке дисков, чтобы добавить идентификатор (который является настраиваемым столбцом), но я получаю сообщение об ошибке недопустимого запроса. Может ли кто-нибудь мне помочь?
Обновлено: Я нашел проблему, по-видимому, она не распознает дополнительные поля, когда я указываю только имя, это работает. Как я могу обновить настраиваемые поля?
public async Task<DriveItem?> CreateDriveItem(FileDTO file)
{
var fileBytes = Convert.FromBase64String(file.Base64);
var fileNameWithExtension = file.FileName + file.FileType;
var requestBody = new CreateUploadSessionPostRequestBody
{
Item = new DriveItemUploadableProperties
{
Name = fileNameWithExtension,
}
};
var uploadSession = await _graphClient.Graph.Drives[_driveId].Root.ItemWithPath(fileNameWithExtension).CreateUploadSession.PostAsync(requestBody);
if (uploadSession == null) { return null; }
using var stream = new MemoryStream(fileBytes);
await UploadFileInChunks(uploadSession.UploadUrl ?? "", stream);
var createdItem = await _graphClient.Graph.Drives[_driveId].Root.ItemWithPath(fileNameWithExtension).GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Expand = new string[] { "listItem($expand=fields)" };
});
if (createdItem == null) { return null; }
var requestBodyPatch = new DriveItem
{
Name = "NomeAtualizado com ID.txt",
ListItem = new ListItem
{
Fields = new FieldValueSet
{
AdditionalData = new Dictionary<string, object>
{
{"ID_Solicitacao", 123 }
}
}
}
};
var patch = await _graphClient.Graph.Drives[_driveId].Items[createdItem.Id].PatchAsync(requestBodyPatch);
if (patch == null) { return null; }
return patch;
}
и ошибка:
{
"message": "OData error occurred.",
"details": "Cannot update a listItem via driveItem, patch the listItem directly"
}





В библиотеке документов SharePoint каждый элемент состоит из DriveItem и ListItem, связанных друг с другом. Чтобы обновить такой элемент, выполните следующие действия:
Сначала вы загружаете документ. Ответ от этой загрузки будет включать созданный DriveItem.
var uploadSession = await_graphClient.Graph.Drives[_driveId].Root.ItemWithPath(fileNameWithExtension).CreateUploadSession.PostAsync(requestBody);
Ответ DriveItem содержит свойство listItem. Это свойство listItem включает идентификатор, который является идентификатором связанного ListItem.
var createdItem = await _graphClient.Graph.Drives[_driveId].Root.ItemWithPath(fileNameWithExtension).GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Expand = new string[] { "listItem($expand=fields)" };
});
createdItem.ListItem?.Id
Используя listItemId, вы можете напрямую обновлять поля ListItem без необходимости его поиска.
var fields = new FieldValueSet
{
AdditionalData = new Dictionary<string, object>
{
{"ID_Solicitacao", 123 }
}
};
var patch = await _graphClient.Graph.Sites[_siteId].Lists[_driveListId].Items[createdItem.ListItem?.Id].Fields.PatchAsync(fields);
Этот метод гарантирует, что вы сможете эффективно загрузить документ и обновить связанные с ним поля ListItem, используя предоставленный идентификатор из ответа на загрузку.