我正在尝试接受以下形式的查询字符串
?param[key1]=value1¶m[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¶m=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"]
您可能会找到 ContainsKey
和 TryGetValue
有助于检查 key 是否存在的方法:
string result;
if (dict["where"].TryGetValue("column", out result))
{
Console.WriteLine(result);
}
关于c# - 将查询字符串数组参数转换为字典值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14652402/