Как создать пользовательский атрибут проверки параметров API, который возвращает неверный запрос как pnet core 3? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть следующая конечная точка в контроллере, и я хотел бы создать пользовательскую проверку для атрибута, переданного из запроса.

[ApiController]
public class SampleController : ControllerBase
{
    [HttpGet]
    [Route("api/user")]
    public IActionResult GetUsersByLevel(
        [BindRequired, ValidLevelFromQuery(Name = "level")] string level)
    {
        ...
    }
}

Мой желаемый результат - создание пользовательского атрибута FromQuery, который в этом примере я описываю как ValidLevelFromQuery. Пользовательский атрибут будет проверять значение level и будет принимать только "A", "B", and "C", при любом другом значении ответ клиенту будет BadRequest.

В настоящее время я выполняю проверку после прочтения значения в действии. Моя цель - сделать эту проверку ранее в конвейере запросов.

Я бы хотел, если возможно, не использовать IValidatableObject.

1 Ответ

0 голосов
/ 04 мая 2020

Вы можете использовать ActionFilter для достижения этой цели.

Пожалуйста, используйте следующий код:

        [HttpGet]
        [Route("api/user")]
        [ValidLevelFromQuery]
        public IActionResult GetUsersByLevel(
           [BindRequired] string level)
        {
            return Ok();
        }

ValidLevelFromQuery метод:

public class ValidLevelFromQueryAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// Validates Level automaticaly
        /// </summary>
        /// <param name="context"></param>
        /// <inheritdoc />
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (context.ActionArguments.ContainsKey("level"))
            {
                string[] allowedGroup = new string[] { "A", "B", "C" };
                if (!allowedGroup.Contains(context.ActionArguments["level"]))
                {
                    context.Result = new BadRequestObjectResult("The level is not allowed");
                }
            }
        }

Вот результат теста:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...