c# - 如何创建在 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
。
解决方案
您可以使用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");
}
}
}
这是测试结果: