Несколько необязательных параметров запроса, но требуется указать хотя бы один из них .NET Core - PullRequest
0 голосов
/ 29 октября 2019

Я создаю конечную точку, которая имеет 3 параметра. Один параметр обязателен и в маршруте. Два других параметра являются параметрами запроса, и необходимо указать хотя бы один из них. Не уверен, как это сделать в ядре .NET.

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

Я видел привязку модели. Нужно ли мне строить модель и проводить валидацию модели? Очевидно, я могу добавить пользовательскую логику для проверки, но у меня есть ощущение, что есть лучший способ справиться с этим.

1 Ответ

0 голосов
/ 29 октября 2019

Проверьте необязательные параметры и подтвердите соответственно

[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) {        

    //...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...