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
放在其他地方。我上面描述的情况只会发生在参数未知的情况下。