Asp Net Core uri 参数中的 IDictionary 问题
Posted
技术标签:
【中文标题】Asp Net Core uri 参数中的 IDictionary 问题【英文标题】:An issue with IDictionary in Asp Net Core uri parameters 【发布时间】:2021-08-10 21:49:52 【问题描述】:我有一个这样声明的端点:
[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 中
【问题讨论】:
【参考方案1】:您只在查询字符串上传递可选参数 Orderby。
/api/v1/usertasks?orderBy=created%3Aasc
按照惯例,如果你有一本字典,它会填满 键值中的“任何字符串和任何字符串”,你将永远不会得到你的可选参数。
要正确使用您的字典,您需要做:
/api/v1/usertasks?processVariables[0]=firstString&processVariables[1]=secondString&orderBy=created%3Aasc
PS:在端点上使用 Dictionary 会破坏你的招摇文档
【讨论】:
【参考方案2】:您可以尝试创建一个包含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();
结果:
【讨论】:
【参考方案3】:我设法使用以下端点签名解决了这个问题:
[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 没有提供所有端点参数都正确填写
【讨论】:
以上是关于Asp Net Core uri 参数中的 IDictionary 问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 OData 的 ASP.Net Core Web API 实现对于单个实体 URI 失败
Google OAuth 2.0 得到错误 400:redirect_uri_mismatch,ASP.net core 3.1
如何将多个参数传递给 ASP.NET Core 中的 get 方法