【问题标题】:Query String ?& empty parameter Web API查询字符串?& 空参数 Web API
【发布时间】:2015-02-02 08:24:46
【问题描述】:

有以下动作:

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 数组,并且可以实例化空的 modelabel 数组,因此我不需要检查空值。但是,如果我将其查询为 /api/stuff?&state=A&state=B(注意额外的 & 号)modelabel 数组不再为空 - 它们都包含单个 null 元素。为什么?

据我了解,查询字符串是等价的。有什么方法可以在不编写自定义活页夹的情况下修复它?

【问题讨论】:

    标签: c# .net url asp.net-web-api model-binding


    【解决方案1】:

    这两个查询字符串不等价。您的第二个查询有第二个 nameless 参数。

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

    /api/stuff?&state=A&state=B = 具有 2 个参数的查询字符串,state 和一个 nameless

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

    路由解析器正确解析state。然而,它检测到第二个参数并且它不知道将它放在哪里。它最终将它放入您的其他两个参数中。

    Route 解析器的逻辑与此类似:
    - 我正在寻找state ...哦,就在这里,让我们填充。
    - 我正在寻找 mode ... 没有找到,但嘿,有一个无名的,让我们用它来填充。
    - 我正在寻找label ... 什么也没找到,但是嘿有一个无名的,让我们用它来填充。

    PS:你可以像这样发送一个无名的查询字符串参数:

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

    【讨论】:

    • 对代码使用反引号,为了强调单词,您可以使用 italicsbold(我已编辑您的答案)
    • 感谢您的提示,从现在开始我一定会这样做的。
    • 天啊,这是人们可以预料到的最奇怪的行为。例如,如果查询字符串中有&extra=1 参数,则活页夹仍然不知道将1 放在哪里(它不知道)。换句话说,如果没有匹配项,就没有理由将不匹配的值放在任何地方。
    • 在您的示例中,如果不会将1 放在其他地方。我上面描述的情况只发生在无名参数的情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2020-01-06
    • 1970-01-01
    • 2013-12-09
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多