c# - 将查询字符串数组参数转换为字典值

标签 c# asp.net-web-api

我正在尝试接受以下形式的查询字符串

?param[key1]=value1&param[key2]=value2

或者替代地

?where[column1]=value1&where[column2]=value1
&orderby[column1]=asc&orderby[column2]=desc

并将其转换为 C# MVC 4 Web API 中的字典,以便可以作为 param["key1"] 进行访问。这在 PHP 中很容易做到,但我还没有找到在 C# 中重现它的任何方法。

我知道我可以通过

?param=value1&param=value2

这样我就可以做类似的事情

?where=column1&where=column2
&whereval=value1&whereval=value2
&orderby=column1&orderby=column2
&orderbycard=asc&orderbycard=desc

但这会留下排序问题,对我的目的来说几乎没有用。

希望这不是框架的限制,我如何在 C# 中实现字典式转换,最好是这样我可以在函数的参数中使用字典?

To clarify: I'm not looking to convert a query string into an NVC, but rather to convert query string parameters into their own NVCs. This is NOT as simple as ParseQueryString() or the Request.QueryString object.

This question上次以重复this question为由关闭,所以我添加了说明。我想请任何考虑将其标记为重复的人在这样做之前考虑我在这里要问的问题,并认真查看我的示例。

最佳答案

没有内置方法可以实现该结果。下面是我的尝试,使用带有命名组的正则表达式。可以跳过拆分并处理正则表达式本身中的 ?& 字符,但我采用这种方法来保持模式更清晰。

string input = "?where[column]=value&where[column2]=value2&orderby[column]=asc&orderby[column2]=desc";
string pattern = @"(?<Type>[^[]+)\[(?<Key>[^]]+)\]=(?<Value>.+)";
var re = new Regex(pattern);
var dict = input.Split(new[] { "?", "&" }, StringSplitOptions.RemoveEmptyEntries)
                .Select(s => re.Match(s))
                .GroupBy(m => m.Groups["Type"].Value)
                .ToDictionary(g => g.Key,
                    g => g.ToDictionary(x => x.Groups["Key"].Value,
                                        x => x.Groups["Value"].Value));

foreach (var t in dict.Keys)
{
    Console.WriteLine("Type: " + t);
    foreach (var k in dict[t].Keys)
    {
        Console.WriteLine("{0}: {1}", k, dict[t][k]);
    }
}

当然,这取决于您事先知道要检查的键,例如,dict["where"]["column"]

您可能会找到 ContainsKeyTryGetValue有助于检查 key 是否存在的方法:

string result;
if (dict["where"].TryGetValue("column", out result))
{
    Console.WriteLine(result);
}

关于c# - 将查询字符串数组参数转换为字典值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14652402/

相关文章:

c# - LINQ to XML 后代中的后代

c# - 使用 XmlIgnoreAttribute 忽略基类属性

c# - 在 Visual Studio 2012、MVC4 中完成调试后终止 w3wp.exe

vb.net - 单击电子邮件中的链接时如何避免启动浏览器

c# - ASP.net Web API 中 MVC 的 DefaultModelBinder 的等价物是什么?

c# - 打开/关闭监视器

c# - 针对 Web api 方法的奇怪 405 错误

C# - Web API - 将枚举序列化为带空格的字符串

asp.net - 重新部署后不记名 token 失效

c# - Xamarin.android如何添加snackbar回调