C# 查询字符串?&;空参数Web API

C# 查询字符串?&;空参数Web API,c#,.net,url,asp.net-web-api,model-binding,C#,.net,Url,Asp.net Web Api,Model Binding,具有下列行为: public IHttpActionResult GetStuff( string like = null, [FromUri]string[] state = null, [FromUri]string[] mode = null, [FromUri]string[] label = null, ) 当我以/api/stuff?state=A&state=B的形式查询它时,模型绑定器用两个字符串值实例化状态数组,并且它可以实例化空的模式和标签数

具有下列行为:

public IHttpActionResult GetStuff(
    string like = null,
    [FromUri]string[] state = null,
    [FromUri]string[] mode = null,
    [FromUri]string[] label = null,
)
当我以
/api/stuff?state=A&state=B
的形式查询它时,模型绑定器用两个字符串值实例化
状态
数组,并且它可以实例化空的
模式
标签
数组,所以我不需要检查空值。但是,如果我将其查询为
/api/stuff?&state=A&state=B
(注意额外的符号)
mode
label
数组不再为空-它们都包含一个
null
元素。为什么?

据我所知,查询字符串是等价的。有没有办法在不编写自定义活页夹的情况下修复它?

这两个查询字符串不相等。第二个查询有第二个匿名参数

/api/stuff?state=A&state=B
=带有1个参数的查询字符串,
state

/api/stuff?&state=A&state=B
=带有两个参数的查询字符串,
state
和一个
无名的
参数

?&
转换为具有
null
值的无名参数名

路由解析器正确解析
状态
。但是,它检测到第二个参数,不知道放在哪里。它最终会把它放在其他两个参数中

路由解析器的逻辑与此类似:
-我正在寻找
状态
。。。哦,就在这里,让我们来填充。
-我正在寻找
模式
。。。没有找到,但是有一个无名的,让我们用它来填充。
-我在找
标签
。。。没找到,但有一个无名的,让我们用它来填充

PS:您可以发送一个匿名查询字符串参数,如下所示:

http://www.myurl.com/?=value

对于代码,对于单词的强调,你可以使用斜体或粗体(我编辑了你的答案)谢谢你的提示,从现在起我一定会这么做。天哪,这是你能想到的最奇怪的行为。例如,如果查询字符串中有
&extra=1
参数,则活页夹仍然不知道将
1
放在何处(而且它也不知道)。换句话说,如果没有匹配项,就没有理由将不匹配的值放在任何地方。在您的示例中,if不会将
1
放在其他地方。我上面描述的情况只会发生在参数未知的情况下。