C# Веб-API - Получение сообщения об ошибке, когда я не передаю все параметры строки запроса - PullRequest
0 голосов
/ 17 июня 2020

У меня есть этот контроллер, который выбирает данные на основе фильтров даты. Если обе даты равны нулю, тогда служба назначит значения по умолчанию.

        [HttpGet]
        [Route("GetOrdersByUserId")]
        public IHttpActionResult GetOrdersByUserId([FromUri] DateTime? startDate = null, [FromUri]  DateTime? endDate = null)
        {
                try
                {
                    ResponseViewModel<object> resp = new ResponseViewModel<object>();
                    OrderService service = new OrderService();
                    resp.data = service.GetOrdersByUserId(startDate, endDate);
                    resp.status.code = (int)HttpStatusCode.OK;
                    return Ok(resp);
                }
                catch (Exception ex)
                {
                    WebApiExceptionHandler.Handle(Request, ref ex);
                    throw;
                }
        }

Следующий случай работает нормально.

... / api / v1 / Retailer / GetOrdersByUserId? StartDate = 2020-02-04 & endDate = 2020-02-05

Однако я получаю это сообщение об ошибке « Аргумент не может быть нулевым", когда я удаляю один или оба параметра. ... / api / v1 / Retailer / GetOrdersByUserId

... / api / v1 / Retailer / GetOrdersByUserId? startDate = 2020-02-04

... / api / v1 / Retailer / GetOrdersByUserId? EndDate = 2020-02-05

Буду признателен, если вы поможете мне решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Я предполагаю, что ошибка находится в строке resp.data = service.GetOrdersByUserId (startDate, endDate); Допускает ли ваш метод OrderService.GetOrdersByuserId также дополнительные параметры? В противном случае ожидается наличие двух параметров, даты начала и окончания.

Что вы можете сделать, так это проверить, являются ли параметры API нулевыми, и установить границы, если они есть. В идеале вы бы изменили значение null конструктора на нужное вам значение, но я не верю, что это можно сделать для DateTime. Например:

if (startDate == null) {
    startDate = new DateTime(1900, 1, 1);
}
if (endDate == null) {
    endDate = new DateTime(9999, 1, 1);
}
//Can be shorter with ternary operators
//Variable =    condition     ?           true           :   false
startDate = startDate == null ? new DateTime(1900, 1, 1) : startDate;
endDate = startDate == null ? new DateTime(9999, 1, 1) : startDate;

//Your existing code
try {
...
}
0 голосов
/ 17 июня 2020

Я думаю, что необязательные аргументы startDate и endDate здесь бесполезны. Вы можете удалить это. Я думаю, что атрибут fromURI здесь тоже бесполезен. DateTime не является сложным типом. Атрибут используется для сложного типа. Просто попробуйте

public IHttpActionResult GetOrdersByUserId(DateTime? startDate, DateTime? endDate)
...