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

基本上,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&lt;string, string&gt; 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();
        

结果:

【讨论】:

【参考方案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&amp;processVariables[0].Value=2&amp;orderBy=created%3Aasc

这样即使 processVariables 没有提供所有端点参数都正确填写

【讨论】:

以上是关于Asp Net Core uri 参数中的 IDictionary 问题的主要内容,如果未能解决你的问题,请参考以下文章

uri查询参数中的asp.net核心JWT?

使用 OData 的 ASP.Net Core Web API 实现对于单个实体 URI 失败

Google OAuth 2.0 得到错误 400:redirect_uri_mismatch,ASP.net core 3.1

如何将多个参数传递给 ASP.NET Core 中的 get 方法

ASP.NET Core MVC 标签助手参数中的字符串文字

ASP.Net Core 3.1 - Web API 中的 Post 参数始终为 NULL