没有System.Web依赖的HttpUtility.ParseQueryString的替代?

Mar*_*inM 16 c# url system.web

我希望能够通过将键和值添加到某个帮助程序类来构建URL查询字符串,并将其作为URL查询返回.我知道这可以做到,就像这样:

var queryBuilder= HttpUtility.ParseQueryString("http://baseurl.com/?");
queryBuilder.Add("Key", "Value");
string url =  queryBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)

这正是我追求的行为.然而,这个类存在于着名的大型中System.Web,我宁愿不为此带来整个库.某处有替代品吗?

Ada*_*des 6

您在示例中使用的HttpValueCollection实际上并不是微不足道的,并且利用System.Web库的许多其他部分为您编码有效的http url.可以提取所需部件的来源,但它可能比你想象的要多得多!

如果您理解并且只是想要一些原始的东西,因为您已经确保键和值被正确编码,那么最简单的方法就是自己滚动.

这是一个示例,以NameValueCollection的扩展方法的形式:

public static class QueryExtensions
{
    public static string ToQueryString(this NameValueCollection nvc)
    {
        IEnumerable<string> segments = from key in nvc.AllKeys
                                       from value in nvc.GetValues(key)
                                       select string.Format("{0}={1}", 
                                       WebUtility.UrlEncode(key),
                                       WebUtility.UrlEncode(value));
        return "?" + string.Join("&", segments);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用此扩展来构建一个查询字符串,如下所示:

// Initialise the collection with values.
var values = new NameValueCollection {{"Key1", "Value1"}, {"Key2", "Value2"}};

// Or use the Add method, if you prefer.
values.Add("Key3", "Value3");

// Build a Uri using the extension method.
var url = new Uri("http://baseurl.com/" + values.ToQueryString());
Run Code Online (Sandbox Code Playgroud)

  • 为什么它的作用与 ParseQueryString 相反,却被标记为正确答案? (2认同)
  • 我无法提供答案,因为它(错误地)被标记为欺骗,但这就是我正在做的事情。我希望它能帮助某人。private Dictionary&lt;string, string&gt; ParseQueryString(string url) { var querystring = url.Substring(url.IndexOf('?') + 1); varpairs = querystring.Split('&amp;'); var dict =pairs.Select(pair =&gt; {var valuePair =pair.Split('='); return new KeyValuePair&lt;string, string&gt;(valuePair[0], valuePair[1]); }) .ToDictionary((kvp) ) =&gt; kvp.Key, (kvp) =&gt; kvp.Value); 返回字典;} (2认同)