首页 > 解决方案 > 如何创建在 aspnet core 3 上返回错误请求的自定义 api 参数验证属性?

问题描述

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

[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

标签: c#validationasp.net-coremodel-view-controllerparameters

解决方案


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

这是测试结果:

在此处输入图像描述


推荐阅读