如何将空值传递给 WebAPI 中的可空类型

Posted

技术标签:

【中文标题】如何将空值传递给 WebAPI 中的可空类型【英文标题】:How to pass null value to nullable types in WebAPI 【发布时间】:2020-04-06 11:34:52 【问题描述】:

我的功能如下:

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

        

我在声明中将 sinceDate 设置为 Nullable 类型,因此如果传递了 null 值,它将采用本地声明的 '_sinceDate' 变量中的日期。 现在如何在进行 API 调用时将 null 值传递给 sinceDate 参数。

当我通过以下网址时: http://localhost:26754/v1/EmployeeMgnt/Departments/4/employeeByDeptId?sinceDate=2020-03-03

我得到了想要的结果。 现在我想将 sinceDate 作为 null 传递。我试过了 http://localhost:26754/v1/EmployeeMgnt/Departments/4/employeeByDeptId?sinceDate=null http://localhost:26754/v1/EmployeeMgnt/Departments/4/employeeByDeptId?sinceDate isnull

所有都给出了错误的请求错误。请告诉我如何在 API 调用中将 null 值分配给 sinceDate?

【问题讨论】:

仅仅从 queryString 中删除 sinceDate 是行不通的。我也必须在函数定义中声明这个 sinceDate=null。 【参考方案1】:

只需在您的路由参数中添加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)

【讨论】:

谢谢。但是为什么我已经将 sinceDate 设为 Nullable 类型时必须声明 parameter = null @kanika 这是一种预防措施,因为您的控制器中可能还有一些东西需要设置,并且您的控制器不接受正在发送的参数。如果在您的请求参数中找不到该键,则添加默认值将立即分配一个空值。【参考方案2】:

据我所知,对于阅读本文的任何人,已接受的答案(本身)不再起作用。请参阅https://github.com/dotnet/aspnetcore/issues/6878#issuecomment-647830903 了解更多详细信息以及 2 种不同的替代方法。

【讨论】:

以上是关于如何将空值传递给 WebAPI 中的可空类型的主要内容,如果未能解决你的问题,请参考以下文章

kotlin 注释处理器中的可空类型

Java 8中的Optional 类型与 Kotlin 中的可空类型

强类型数据表/数据集中的可空类型 - 解决方法?

为啥空字符串上的 .ToString() 会导致空错误,而 .ToString() 在具有空值的可空 int 上工作正常?

可空类型的 datagridview 组合框下拉列表中的空值

C# 8中的可空引用类型