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 出现在 processVariablesorderBy参数:

基本上 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> processVariablesstring 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,所有端点参数也会正确填写