【问题标题】:How do I create a custom api parameter validation attribute which returns bad request on aspnet core 3?如何创建在 aspnet core 3 上返回错误请求的自定义 api 参数验证属性?
【发布时间】:2020-05-04 15:58:05
【问题描述】:

我的控制器中有以下端点,我想为从查询传递的属性创建自定义验证。

[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

【问题讨论】:

  • 您可以创建一个自定义属性并在其中设置您的逻辑,然后将该属性添加到您的参数中,例如 BindRequired。
  • 谢谢,根据您的建议设法得出了解决方案。

标签: c# validation asp.net-core model-view-controller parameters


【解决方案1】:

您可以使用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");
                }
            }
        }

这是测试结果:

【讨论】:

  • 找到了一个基于 Aspram 的 cmets 的解决方案,这正是你所回答的。感谢您抽出宝贵时间回答,我们会接受您的回答,以便其他人看到。
猜你喜欢
  • 2019-08-14
  • 2021-11-10
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
相关资源
最近更新 更多