我正在寻找将查询字符串从HTTP GET请求转换为字典的最简单方法,然后再返回。
我认为一旦它以字典形式对查询进行各种操作就会更容易,但我似乎有很多代码只是为了进行转换。任何推荐的方式?
答案 0 :(得分:62)
HttpUtility.ParseQueryString()
将查询字符串解析为NameValueCollection
个对象,将后者转换为IDictionary<string, string>
只是一个简单的foreach
。但是,这可能是不必要的,因为NameValueCollection
有一个索引器,所以它的行为非常像字典。
答案 1 :(得分:30)
以下是我通常的做法
Dictionary<string, string> parameters = HttpContext.Current.Request.QueryString.Keys.Cast<string>()
.ToDictionary(k => k, v => HttpContext.Current.Request.QueryString[v]);
答案 2 :(得分:14)
HttpUtility.ParseQueryString
怎么样?
只需添加对System.Web.dll
的引用即可答案 3 :(得分:9)
只需为单声道兼容解决方案执行此操作
Regex.Matches(queryString, "([^?=&]+)(=([^&]*))?").Cast<Match>().ToDictionary(x => x.Groups[1].Value, x => x.Groups[3].Value)
答案 4 :(得分:7)
我喜欢Jon Canning's answer的简洁,但为了多样化,这里是他的答案的另一种选择,这也适用于缺少HttpUtility.ParseQueryString()
实用程序的受限环境,如Windows Phone 8 :
public static Dictionary<string, string> ParseQueryString(String query)
{
Dictionary<String, String> queryDict = new Dictionary<string, string>();
foreach (String token in query.TrimStart(new char[] { '?' }).Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries))
{
string[] parts = token.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length == 2)
queryDict[parts[0].Trim()] = HttpUtility.UrlDecode(parts[1]).Trim();
else
queryDict[parts[0].Trim()] = "";
}
return queryDict;
}
实际上,对Canning的解决方案的一个有用的改进,即解码url编码的值(如上面的解决方案):
public static Dictionary<string, string> ParseQueryString2(String query)
{
return Regex.Matches(query, "([^?=&]+)(=([^&]*))?").Cast<Match>().ToDictionary(x => x.Groups[1].Value, x => HttpUtility.UrlDecode( x.Groups[3].Value ));
}
答案 5 :(得分:6)
与Sean相同,但使用Linq(以及可以复制和粘贴的功能):
public static Dictionary<string, string> ParseQueryString(string queryString)
{
var nvc = HttpUtility.ParseQueryString(queryString);
return nvc.AllKeys.ToDictionary(k => k, k => nvc[k]);
}
此外,问题是如何将其恢复为查询字符串:
public static string CreateQueryString(Dictionary<string, string> parameters)
{
return string.Join("&", parameters.Select(kvp =>
string.Format("{0}={1}", kvp.Key, HttpUtility.UrlEncode(kvp.Value))));
}
答案 6 :(得分:5)
一个没有HttpUtility的衬里
var dictionary = query.Replace("?", "").Split('&').ToDictionary(x => x.Split('=')[0], x => x.Split('=')[1]);
答案 7 :(得分:4)
另一种方法:
NameValueCollection nvcData = HttpUtility.ParseQueryString(queryString);
Dictionary<string, string> dictData = new Dictionary<string, string>(nvcData.Count);
foreach (string key in nvcData.AllKeys)
{
dictData.Add(key, nvcData.Get(key));
}
答案 8 :(得分:3)
在ASP.NET Core中,使用ParseQuery。
var query = HttpContext.Request.QueryString.Value;
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);
答案 9 :(得分:0)
最简单:
Dictionary<string, string> parameters = new Dictionary<string, string>();
for (int i = 0; i < context.Request.QueryString.Count; i++)
{
parameters.Add(context.Request.QueryString.GetKey(i), context.Request.QueryString[i]);
}
答案 10 :(得分:0)
代替将 HttpContext.Request.QueryString转换为字典<>,请尝试使用
HttpContext.Request.Query which already is a Dictionary<string, StringValues>
答案 11 :(得分:0)
您可以通过用FromQueryAttribute
装饰参数来获得它
public void Action([FromQuery] Dictionary<string, string> queries)
{
...
}
P.S。如果要为每个键获取多个值,可以将字典更改为Dictionary<string, List<string>>
答案 12 :(得分:0)
AspNet Core 现在自动包含 HttpRequest.Query
,它的使用类似于带有键访问器的字典。
但是,如果您需要将其转换为日志记录或其他目的,您可以将该逻辑提取到扩展方法中,如下所示:
public static class HttpRequestExtensions
{
public static Dictionary<string, string> ToDictionary(this IQueryCollection query)
{
return query.Keys.ToDictionary(k => k, v => (string)query[v]);
}
}
然后,您可以像这样在 httpRequest 上使用它:
var params = httpRequest.Query.ToDictionary()
进一步阅读