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
这样,即使未提供过程变量,也会正确填写所有端点参数