Asp Net Core uri 参数中的 IDictionary 存在问题
An issue with IDictionary in Asp Net Core uri parameters
我有一个这样声明的端点:
[HttpGet]
public async Task<IActionResult> GetTasks([FromQuery] IDictionary<string, string> processVariables, string orderBy = "created:asc")
当我用查询 /api/v1/usertasks?orderBy=created%3Aasc 触发它时,字符串 created:asc
出现在 processVariables
和 orderBy
参数:
基本上 Asp Net Core 引擎将此值视为字典键值和名为 orderBy
的参数。有没有办法使 created:asc
值仅作为 orderBy
参数解析?
否则,什么是组织此端点的最佳方式,使其具有字典参数和带默认值的字符串参数?
这发生在 Asp Net Core 3.1
您只在查询字符串中传递了可选参数 Orderby。
/api/v1/usertasks?orderBy=created%3Aasc
按照惯例,如果你有字典,它会填满
键值中的“whatever string & whatever string”,你将永远不会得到你的可选参数。
要正确使用您的词典,您需要做的是:
/api/v1/usertasks?processVariables[0]=firstString&processVariables[1]=secondString&orderBy=created%3Aasc
PS:在端点上使用字典会破坏您的 swagger 文档
你可以尝试创建一个包含IDictionary<string, string> processVariables
和string orderBy = "created:asc"
的模型,这样orderBy=created%3Aasc就不会绑定到processVariables
。这里是一个演示:
型号:
public class DictionaryModel
{
public string orderBy { get; set; }
public IDictionary<string, string> processVariables { get; set; }
}
操作:
[HttpGet]
public async Task<IActionResult> GetTasks(DictionaryModel d)
{
return Ok();
}
结果:
我设法使用以下端点签名解决了问题:
[HttpGet]
public async Task<IActionResult> GetTasks([FromQuery] ICollection<KeyValuePair<string, string>> processVariables, string orderBy = "created:asc")
应使用此调用端点 url:
/api/v1/usertasks?processVariables[0].Key=1&processVariables[0].Value=2&orderBy=created%3Aasc
即使未提供 processVariables,所有端点参数也会正确填写
我有一个这样声明的端点:
[HttpGet]
public async Task<IActionResult> GetTasks([FromQuery] IDictionary<string, string> processVariables, string orderBy = "created:asc")
当我用查询 /api/v1/usertasks?orderBy=created%3Aasc 触发它时,字符串 created:asc
出现在 processVariables
和 orderBy
参数:
基本上 Asp Net Core 引擎将此值视为字典键值和名为 orderBy
的参数。有没有办法使 created:asc
值仅作为 orderBy
参数解析?
否则,什么是组织此端点的最佳方式,使其具有字典参数和带默认值的字符串参数?
这发生在 Asp Net Core 3.1
您只在查询字符串中传递了可选参数 Orderby。
/api/v1/usertasks?orderBy=created%3Aasc
按照惯例,如果你有字典,它会填满 键值中的“whatever string & whatever string”,你将永远不会得到你的可选参数。
要正确使用您的词典,您需要做的是:
/api/v1/usertasks?processVariables[0]=firstString&processVariables[1]=secondString&orderBy=created%3Aasc
PS:在端点上使用字典会破坏您的 swagger 文档
你可以尝试创建一个包含IDictionary<string, string> processVariables
和string orderBy = "created:asc"
的模型,这样orderBy=created%3Aasc就不会绑定到processVariables
。这里是一个演示:
型号:
public class DictionaryModel
{
public string orderBy { get; set; }
public IDictionary<string, string> processVariables { get; set; }
}
操作:
[HttpGet]
public async Task<IActionResult> GetTasks(DictionaryModel d)
{
return Ok();
}
结果:
我设法使用以下端点签名解决了问题:
[HttpGet]
public async Task<IActionResult> GetTasks([FromQuery] ICollection<KeyValuePair<string, string>> processVariables, string orderBy = "created:asc")
应使用此调用端点 url:
/api/v1/usertasks?processVariables[0].Key=1&processVariables[0].Value=2&orderBy=created%3Aasc
即使未提供 processVariables,所有端点参数也会正确填写