Asp.net mvc Asp Net核心uri参数中的IDictionary存在问题

Asp.net mvc Asp Net核心uri参数中的IDictionary存在问题,asp.net-mvc,asp.net-core,routes,asp.net-mvc-routing,Asp.net Mvc,Asp.net Core,Routes,Asp.net Mvc Routing,我有一个端点是这样声明的: [HttpGet] public async Task<IActionResult> GetTasks([FromQuery] IDictionary<string, string> processVariables, string orderBy = "created:asc") [HttpGet] 公共异步任务GetTasks([FromQuery]IDictionary processVariables,string

我有一个端点是这样声明的:

[HttpGet]
public async Task<IActionResult> GetTasks([FromQuery] IDictionary<string, string> processVariables, string orderBy = "created:asc")
[HttpGet]
公共异步任务GetTasks([FromQuery]IDictionary processVariables,string orderBy=“created:asc”)
当我使用query/api/v1/usertasks?orderBy=created%3Aasc触发它时,字符串
created:asc
出现在
processVariables
orderBy
参数中:

基本上,Asp Net核心引擎将此值视为字典键值和名为
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

注:在端点上使用Dictionary将中断您的swagger文档

您只在查询字符串上传递可选参数Orderby

/api/v1/usertasks?orderBy=created%3Aasc
按照惯例,如果你有一本字典,它会被填满 “whatever string&whatever string”在键值中,您将永远不会使用可选参数

要正确使用词典,您需要执行以下操作:

/api/v1/usertasks?processVariables[0]=firstString&processVariables[1]=secondString&orderBy=created%3Aasc

注:在端点上使用字典将破坏您的招摇过市文档

您可以尝试创建一个模型,其中包含一个包含
IDictionary processVariables
string orderBy=“created:asc”
,这样orderBy=created%3Aasc将不会绑定到
processVariables
。下面是一个演示:

型号:

public class DictionaryModel
    {
        public string orderBy { get; set; }
        public IDictionary<string, string> processVariables { get; set; }

    }
公共类字典模型
{
公共字符串orderBy{get;set;}
公共IDictionary processVariables{get;set;}
}
行动:

[HttpGet]
        public async Task<IActionResult> GetTasks(DictionaryModel d)
        {
            return Ok();
        }
[HttpGet]
公共异步任务GetTasks(DictionaryModel d)
{
返回Ok();
}
结果:

您可以尝试创建一个模型,其中包含一个包含
IDictionary processVariables
字符串orderBy=“created:asc”
,这样orderBy=created%3Aasc就不会绑定到
processVariables
。下面是一个演示:

型号:

public class DictionaryModel
    {
        public string orderBy { get; set; }
        public IDictionary<string, string> processVariables { get; set; }

    }
公共类字典模型
{
公共字符串orderBy{get;set;}
公共IDictionary processVariables{get;set;}
}
行动:

[HttpGet]
        public async Task<IActionResult> GetTasks(DictionaryModel d)
        {
            return Ok();
        }
[HttpGet]
公共异步任务GetTasks(DictionaryModel d)
{
返回Ok();
}
结果:

我使用以下端点签名解决了问题:

[HttpGet]
public async Task<IActionResult> GetTasks([FromQuery] ICollection<KeyValuePair<string, string>> processVariables, string orderBy = "created:asc")
[HttpGet]
公共异步任务GetTasks([FromQuery]ICollection processVariables,string orderBy=“created:asc”)
应使用以下url调用终结点:

/api/v1/usertasks?processVariables[0]。Key=1&processVariables[0]。Value=2&orderBy=created%3Aasc


通过这种方式,即使未提供过程变量,所有端点参数都已正确填写

我使用以下端点签名解决了问题:

[HttpGet]
public async Task<IActionResult> GetTasks([FromQuery] ICollection<KeyValuePair<string, string>> processVariables, string orderBy = "created:asc")
[HttpGet]
公共异步任务GetTasks([FromQuery]ICollection processVariables,string orderBy=“created:asc”)
应使用以下url调用终结点:

/api/v1/usertasks?processVariables[0]。Key=1&processVariables[0]。Value=2&orderBy=created%3Aasc

这样,即使未提供过程变量,也会正确填写所有端点参数