При использовании HttpPatch
с OData
я хочу установить int[]
списка доступа для пользователей. Я отправляю int[] ACL
(список доступа). Другие поля из RoleDto могут быть изменены, однако, int [] не может быть изменен. Допустим, у меня есть роль с доступом 1,2,3, и я хочу изменить ее на 2,3. Если я делаю это с помощью патча, это вызывает исключение. Он даже не попадает в контроллер, он ломается в промежуточном программном обеспечении.
Значение не относится к типу "System.Int32" и не может использоваться в этой коллекции generi c.
Вот действие контроллера.
[ODataRoute("/api/v1/roles/")]
[HttpPatch("{id}")]
[ValidateModel]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
public async Task<IActionResult> Patch([FromRoute] string id, [FromBody] Delta<RoleDto> patch)
{
var role = await roleManagerWrapper.FindRoleByIdAsync(id);
if (role == null) throw new NotFoundException($"Role with id {id} was not found");
var dto = mapper.Map<RoleDto>(role);
patch.Patch(dto);
mapper.Map(dto, role);
AccessList.ValidateACLValues(dto.AccessLevel);
await dbContext.SaveChangesAsync();
return NoContent();
}
Вот RoleDto:
[MapFrom(typeof(IntentRole))]
public class RoleDto
{
public string Id { get; set; }
public string Name { get; set; }
public int UserCount { get; set; }
[MaxLength(200)]
public string Group { get; set; }
public int[] AccessLevel { get; set; }
}
Вот IntentRole:
public class IntentRole : IdentityRole
{
[MaxLength(200)]
public string Group { get; set; }
public int[] AccessLevel { get; set; }
}
Проверка для уровни доступа:
public static void ValidateACLValues(int[] accessLevel)
{
foreach (var access in accessLevel)
{
if (access <= 0)
{
throw new BadRequestException("Cannot set access level to a non-positive number!");
}
if (!Access.Any(a => a.AccessLevel.Equals(access)))
{
throw new NotFoundException($"Access level with value {access} has not been defined");
}
}
}
Это JSON, который я отправлял:
{ "name": "test", "group": "test", "AccessLevel": [ 1,2,4 ] }