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

Escaping square brackets in dictionary keys passed via query string

我有一个 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

...with responses 包含一个带有关键字 Bar[2 的条目。很明显输入需要转义,但我没能找到任何文档说明如何做到这一点,以下方法也没有奏效:

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

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

您可以使用以下请求:

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

结果:

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

我相信有两种方法可以解决这个问题。首先,您可以通过将字典与 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