Как передать нулевое значение типам, допускающим значение null, в WebAPI

У меня есть функция, как показано ниже:

        [HttpGet]
        [Route("Departments/{departmentid}/employeeByDeptId")]
        [ResponseType(responseType: typeof(IList<Employee>))]
        public HttpResponseMessage GetDetailsByDeptId(int departmentId, DateTime? sinceDate)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            var detailInfo = _employeeManager.GetDetailInfo(departmentId, sinceDate ?? _sinceDate);

            return CreateHttpResponseMessage(detailInfo);

        }

Я сделал в объявлении тип afterDate как Nullable, так что, если передается нулевое значение, оно принимает дату, которая находится в переменной _sinceDate, объявленной локально. Теперь, как я могу передать нулевое значение параметруnceDate при вызове API.

Когда я передаю ниже URL-адрес: http://localhost:26754/v1/EmployeeMgnt/Departments/4/employeeByDeptId?sinceDate=2020-03-03

Я получаю желаемый результат. Теперь я хочу пройти с даты как null. Я попробовал http://localhost:26754/v1/EmployeeMgnt/Departments/4/employeeByDeptId?sinceDate=null http://localhost:26754/v1/EmployeeMgnt/Departments/4/employeeByDeptId?sinceDate имеет значение null

Все выдавали ошибку плохого запроса. Скажите, пожалуйста, как я могу присвоить нулевое значение для OnceDate в вызове API?


person kanika    schedule 06.04.2020    source источник
comment
простое удаление afterDate из queryString не работает. Я также должен объявить это, поскольку Date=null в определении функции.   -  person kanika    schedule 06.04.2020


Ответы (2)


Просто добавьте parameterName = null в параметр маршрута.

public HttpResponseMessage GetDetailsByDeptId(int departmentId, DateTime? sinceDate = null){
}

Затем в своем запросе вы можете просто исключить этот параметр и получить доступ с помощью;

http://localhost:26754/v1/EmployeeMgnt/Departments/4/employeeByDeptId

Другой вариант — добавить перегрузку. Имейте 2 имени функции, получающих разные параметры.

public HttpResponseMessage GetDetailsByDeptId(int departmentId, DateTime sinceDate){
}

public HttpResponseMessage GetDetailsByDeptId(int departmentId){
}
person Jerdine Sabio    schedule 06.04.2020
comment
Спасибо за это. Но почему я должен объявлять параметр = null, когда я уже сделал с DateDate как тип Nullable - person kanika; 06.04.2020
comment
@kanika это мера предосторожности, потому что в вашем контроллере может быть что-то еще не настроено, и ваш контроллер не принимает отправляемые параметры. Добавление значения по умолчанию немедленно присвоит нулевое значение, если ключ не найден в параметрах вашего запроса. - person Jerdine Sabio; 06.04.2020

Насколько я могу судить, для всех, кто читает это, принятый ответ больше не работает (сам по себе). См. https://github.com/dotnet/aspnetcore/issues/6878#issuecomment-647830903 для более подробной информации и 2 различных альтернативных способов обойти это.

person carl-johan.blomqvist    schedule 11.06.2021