首页 > 解决方案 > 在 C# 中,如何获取查询字符串的键值对,其中键应该是属性,值应该是与 $ 符号关联的变量

问题描述

查询字符串的类型为:

filter[dummyId1]=like:$Id1&filter[dummyId2]=like:$Id2

我需要的是:

键:dummyId1,值:Id1
键:dummyId2,值:Id2

我怎样才能做到这一点?我试过使用HttpUtility.ParseQueryString()and String.Split("&"),但都没有给出想要的结果。

标签: c#asp.net-core.net-core

解决方案


你读的query params怎么样?

好的,编写了一些示例

  • 自动从[FromQuery]
  • 迭代HttpUtility.ParseQueryString
  • NamedValueCollectionLinq 映射到List<KeyValuePair<string, string>>@Martin 提供的使用正则表达式
[HttpGet("kvp")]
public ActionResult GetKvp([FromQuery] Dictionary<string, string> filter)
{
    // This line will print {"dummyId1":"like:$Id1","dummyId2":"like:$Id2"}
    System.Console.WriteLine(JsonSerializer.Serialize(filter)); //automagica fromquery

    var parsed = HttpUtility.ParseQueryString(Request.QueryString.ToString());

    foreach (string item in parsed)
    {
      // this will print filter[dummyId1] / filter[dummyId2]
      System.Console.WriteLine(item);
      // this will print like:$Id1 / like:Id2
      System.Console.WriteLine(parsed.Get(item));
     }

      var kvps = parsed.AllKeys.Select(x =>
      {
        // Regex from @Martin answer
        var key = Regex.Match(x, "filter\\[([a-zA-Z0-9]+)\\]");
        var filterName = key.Groups[1].Value;
        var value = parsed.Get(x);
        var newValue = value.Replace("like:$", "", StringComparison.Ordinal);
        return new KeyValuePair<string, string>(filterName, newValue);
      }).ToList();

      // this will print [{"Key":"dummyId1","Value":"Id1"},{"Key":"dummyId2","Value":"Id2"}]
      System.Console.WriteLine(JsonSerializer.Serialize(kvps));

    return Ok();
}

推荐阅读