转义通过查询字符串传递的字典键中的方括号
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
我有一个 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