Значение не относится к типу "System.Int32" и не может использоваться в этой коллекции generi c. - PullRequest
0 голосов
/ 06 февраля 2020

При использовании 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");
            }
        }
    }

enter image description here

Это JSON, который я отправлял:

{ "name": "test", "group": "test", "AccessLevel": [ 1,2,4 ] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...