代码之家  ›  专栏  ›  技术社区  ›  Bradley Smith

通过查询字符串传递的字典键中的转义方括号

  •  1
  • Bradley Smith  · 技术社区  · 2 年前

    我有一个API操作,它接受来自查询字符串的字典,如下所示:

    [ApiController]
    public class MyController : ControllerBase {
        public async Task<ActionResult> Post(CancellationToken ct, [FromQuery(Name = "responses")] Dictionary<string, bool> responses, [FromBody] MyModelType model) { }
    }
    

    字典键描述了上的嵌套属性 model (作为请求主体发送),例如:

    Foo
    Foo.Bar
    Bar[2].Foo
    

    对于上面的前两个键,字典绑定可以正常工作(正如您所期望的):

    POST https://localhost/MyController?responses[Foo]=true&responses[Foo.Bar]=false
    

    但是,对于第三个键,由于方括号的原因,它失败了:

    POST https://localhost/MyController?responses[Bar[2].Foo]=false
    

    ...具有 responses 包含一个带有密钥的条目 Bar[2 .显然,输入需要转义,但我还没有找到任何关于如何进行转义的文档,以下方法也不起作用:

    Bar\[2\].Foo
    Bar[%5B2%5D].Foo
    

    绑定到字典时,我应该如何转义查询字符串中的方括号?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Rena    2 年前

    您可以使用以下请求:

    https://localhost/MyController?responses[0].key=bar[2].Foo&responses[0].value=false
    

    结果:

    enter image description here

    供你使用 [FromQuery(Name = "responses")] ,所以你必须使用 responses[index].xxx .

        2
  •  0
  •   Jeremy Lakeman    2 年前

    我相信有两种方法可以解决这个问题。首先,你可以把一本字典当作一本字典来装订 List<KeyPair<,>> .提供;

    https://localhost/MyController?responses[0].key=Foo&responses[0].value=true&responses[1].key=bar[2].Foo&responses[1].value=false
    

    或者,您可以显式地提供所有索引名,而不是数字索引;

    https://localhost/MyController?responses.index=Foo&responses.index=bar[2].Foo&responses[Foo]=true&responses[bar[2].Foo]=false