采取以下行动:
public IHttpActionResult GetStuff(
string like = null,
[FromUri]string[] state = null,
[FromUri]string[] mode = null,
[FromUri]string[] label = null,
)
当我将其查询为/api/stuff?state=A&state=B
时,模型绑定器使用2个字符串值实例化state
数组,并且它足以实例化空mode
和label
数组所以我不需要检查空值。但是,如果我将其查询为/api/stuff?&state=A&state=B
(请注意额外的&符号)mode
和label
数组不再为空 - 它们都包含单个null
元素。为什么呢?
根据我的理解,查询字符串是等效的。有没有办法在不编写自定义绑定器的情况下修复它?
答案 0 :(得分:2)
两个查询字符串不等效。您的第二个查询有第二个无名参数。
/api/stuff?state=A&state=B
=带有1个参数state
的查询字符串。
/api/stuff?&state=A&state=B
=包含2个参数的查询字符串,state
和nameless
个。
?&
转换为无名参数名称,其值为null
。
Route解析器正确解析state
。但是它会检测到第二个参数,但它不知道放在哪里。它最终将它放在你的其他参数中。
Route解析器的逻辑与此类似:
- 我正在寻找state
...哦,就是这样,让我们来吧
- 我正在寻找mode
......没有找到任何东西,但是嘿,有一个无名的,让我们填充它。
- 我正在寻找label
......没有找到任何东西,但是嘿,有一个无名的,让我们填充它。
PS:你可以像这样发送一个无名的查询字符串参数:
http://www.myurl.com/?=value