替代 HttpUtility.ParseQueryString,不依赖 System.Web

本文关键字:依赖 System Web HttpUtility ParseQueryString 替代 | 更新日期: 2023-09-27 18:34:06

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

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

这正是我所追求的行为。但是,这个类存在于著名的大System.Web中,我宁愿不为此引入整个库。在某个地方有替代方案吗?

替代 HttpUtility.ParseQueryString,不依赖 System.Web

您在示例中使用的 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);
    }
}

可以使用此扩展来生成查询字符串,如下所示:

// 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());
相关文章: