【发布时间】:2021-11-19 14:00:21
【问题描述】:
我有一个用 .NET Core 2.1 编写的 Web API 项目。我正在尝试创建一个可以将十进制值数组作为参数的操作。
如果我将参数数据类型定义为string[] 或int[],那么当我调用操作时,传入逗号分隔的字符串,Web API 能够将其解析为字符串数组或整数数组.
但是,如果我将参数的数据类型更改为 decimal[] 并使用相同的逗号分隔字符串再次调用它,Web API 会去掉逗号并将值连接在一起以形成一个大的小数。
如果参数定义为int[],为什么它会正确拆分逗号分隔的字符串,但如果它是decimal[],则不会?
例子:
这是我的行动:
[HttpGet("details/{shipmentDetailIds}")]
public async Task<List<ShipmentDetail>> GetByShipmentDetailIds(decimal[] shipmentDetailIds)
{
...
}
当我将参数定义为十进制数组时,下面是在操作中解析数组的方式:
您可以看到它有效地去除了逗号并将三个数字连接在一起成为一个大的十进制值。
但是如果我将参数的数据类型更改为int[] 并使用相同的参数值从 Postman 再次调用它,这一次 Web API 会正确解析参数,将其拆分为三个数字:
为什么将相同的参数解析为十进制数组和整数数组时会出现不同的行为?我怎样才能让它正确解析逗号分隔的小数?
编辑:我知道我可以通过在查询字符串中传递数组来使其工作。但是,我正在更新一个现有应用程序,其中所有参数都在 URL 路径中传递,而不是查询字符串,所以我想继续使用相同的约定。另一种选择是使用整数数组,因为它有效。然而,虽然 shippingDetailIds 目前看起来是整数,但仓库管理系统中的数据类型是十进制。我宁愿坚持使用正确的数据类型,以防将来开始使用十进制样式的 shippingDetailIds 发货。
【问题讨论】:
-
这当然看起来很奇怪。如果您包含一个小数位(“3215669.0,3215670.0,3215994.0”),它会做什么?
-
这就是您应该使用 Postman 发送数组的方式吗?我以为你应该有多个条目。所以这里有多个
shipmentDetails行,每行都有自己的值。 -
我知道你在新西兰。 (我认出了您签名上的图片,并检查了您的个人资料。)我敢肯定,您会想到这一点,但这可能与您盒子上的文化设置以及从字符串到数字的默认解析行为有关吗?我想知道它是否将逗号视为在美国我们所说的“小数点”。
-
(我不知道新西兰的数字表示约定,但我可能会想到。)
-
@AnnL.:我尝试了您的建议,即在逗号分隔的输入字符串中的每个数字后添加一个小数位:
3215669.0,3215670.0,3215994.0。 Web API 根本不解析它。它不会抛出错误,而是将输入视为一个空的十进制数组。
标签: c# asp.net-core .net-core asp.net-web-api