多个可选查询参数,但要求至少提供一个。NETCore

时间:2019-10-29 01:25:02

标签: c# asp.net-core

我正在创建一个具有3个参数的端点。在路径中需要一个参数。其他2个参数是查询参数,至少需要提供其中一个。不确定如何在.NET核心中执行此操作。

[HttpGet("{source}")]
public ActionResult<IEnumerable<string>> Get(
    string source, 
    [FromQuery] string year, 
    [FromQuery] string genre)
{
}

我看到了模型绑定。我需要建立模型并进行模型验证吗?我显然可以向控制器添加自定义逻辑来进行检查,但是我感觉有更好的方法来处理此问题。

1 个答案:

答案 0 :(得分:0)

检查可选参数并进行相应验证

[HttpGet("{source}")]
public ActionResult<IEnumerable<string>> Get(
    string source, 
    [FromQuery] string year, 
    [FromQuery] string genre) {

    if(string.IsNullOrEmpty(year) && string.IsNullOrEmpty(genre))
        return BadRequest();

    //...
}

否则,您将需要一个自定义过滤器来检查查询字符串

[ProducesResponseType(400)]
public class ValidateQueryStringStateAttribute : ActionFilterAttribute {
    public override void OnActionExecuting(ActionExecutingContext context) {

        var query = context.Request.Query;

        if(!query.ContainsKey("year") && !query.ContainsKey("genre"))
            context.ModelState.AddModelError("", "At least year or genre required");

        if (!context.ModelState.IsValid) {
            var result = new Dictionary<string, string>();
            foreach (var key in context.ModelState.Keys) {
                result.Add(key, String.Join(", ", context.ModelState[key].Errors.Select(p => p.ErrorMessage)));
            }

            // 400 - Bad Request
            context.Result = new ObjectResult(result) { StatusCode = 400 };
        }
    }
}

并用于操作

[HttpGet("{source}")]
[ValidateQueryStringState]
public ActionResult<IEnumerable<string>> Get(
    string source, 
    [FromQuery] string year, 
    [FromQuery] string genre) {        

    //...

}