【问题标题】:Parse URL array parameters into C# Dictionaries将 URL 数组参数解析为 C# 字典
【发布时间】:2014-07-04 09:58:34
【问题描述】:

我有以下代码来解析 URL 中的键值对:

    public static NameValueCollection ParseQueryString(String query)
    {
        NameValueCollection queryParameters = new NameValueCollection();
        string[] querySegments = query.Split('&');
        foreach (string segment in querySegments)
        {
            string[] parts = segment.Split('=');
            if (parts.Length > 0)
            {
                string key = parts[0].Trim(new char[] { '?', ' ' });
                string val = parts[1].Trim();

                queryParameters.Add(key, val);
            }
        }

        return queryParameters;
    }

我是这样使用这个函数的:

args = ParseQueryString("alpha=1&beta=bbbb&array%5B0%5D%5Ba%5D=1&array%5B0%5D%5Bb%5D=2&array%5B1%5D%5Ba%5D=1&array%5B1%5D%5Bb%5D=2&array%5B%5D=3&array%5B%5D=4");
foreach (var k in args.AllKeys)
{
    tw.WriteLine(k + ": " + args[k]);
}

输出:

alpha: 1
beta: bbbb
array[0][a]: 1
array[0][b]: 2
array[1][a]: 1
array[1][b]: 2
array[]: 3,4

我需要嵌套 NameValueCollections 或嵌套字典的输出,所以我可以像这样访问这些值:

args = ParseQueryString("alpha=1&beta=bbbb&array%5B0%5D%5Ba%5D=1&array%5B0%5D%5Bb%5D=2&array%5B1%5D%5Ba%5D=1&array%5B1%5D%5Bb%5D=2&array%5B%5D=3&array%5B%5D=4");
var item = args.Get("array").Get(0).Get("b"); // will be "2"

实现此目的最优雅的方法是什么?我更喜欢没有 System.Web 或任何额外参考的解决方案。

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 不使用专为某项任务设计的库通常会让自己的生活变得不必要地困难
  • @BenAaronson 你是对的,但我希望我的应用程序与 4.0 客户端配置文件兼容。无论如何,我也会对 System.Web 解决方案感到满意!
  • @cahinton 我看过那个问题,没有提到查询字符串中编码的数组。

标签: c# .net http url


【解决方案1】:

如果你使用 ASP.NET MVC Framework,默认的 MVC 参数绑定器可以通过以下方式自动处理:

// GetData?filters[0][field]=fieldName&filters[0][type]=number&filters[0][value]=3
public ActionResult GetData(IEnumerable<Dictionary<string,string>> filters) 
{
    // todo
}

有关更多信息和示例,请查看我在此主题上写的 this blog post

【讨论】:

    猜你喜欢
    • 2021-07-13
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2016-06-06
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多