【问题标题】:An issue with IDictionary in Asp Net Core uri parametersAsp Net Core uri 参数中的 IDictionary 问题
【发布时间】: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 中

【问题讨论】:

    标签: asp.net-mvc asp.net-core routes asp.net-mvc-routing


    【解决方案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 没有提供所有端点参数都正确填写

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-11
          • 1970-01-01
          • 1970-01-01
          • 2020-12-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-14
          • 1970-01-01
          相关资源
          最近更新 更多