簡體   English   中英

如何創建自定義 api 參數驗證屬性,該屬性在 aspnet 核心 3 上返回錯誤請求?

[英]How do I create a custom api parameter validation attribute which returns bad request on aspnet core 3?

我的 controller 中有以下端點,我想為從查詢傳遞的屬性創建自定義驗證。

[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");
                }
            }
        }

這是測試結果:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM