C# 没有System.Web依赖项的HttpUtility.ParseQueryString的替代方案?

C# 没有System.Web依赖项的HttpUtility.ParseQueryString的替代方案?,c#,url,system.web,C#,Url,System.web,我希望能够通过将键和值添加到某个帮助器类并让它作为URL查询返回来构建URL查询字符串。我知道这是可以做到的,就像这样: var queryBuilder= HttpUtility.ParseQueryString("http://baseurl.com/?"); queryBuilder.Add("Key", "Value"); string url = queryBuilder.ToString(); 这正是我所追求的行为。然而,这个类存在于著名的大型系统.Web中,我不希望为了这个而引

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

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

这正是我所追求的行为。然而,这个类存在于著名的大型
系统.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);
    }
}

试试System.Uri:你为什么关心System.Web的大小?无论如何,它已经部署在框架中了。这里有一个解决方案:如果您查看源代码,解析/tostring的代码非常简单,没有对System.Web的额外依赖;这不是复制品。它明确询问如何在不使用
System.Web
的情况下执行此操作,这是另一个问题的处理方式。使用
WebUtility.UrlEncode()
@SevaAlekseyev-Done围绕
,好的建议:)为什么这与ParseQueryString正好相反,却被标记为正确答案?@Jonathanalen好吧,标题很差,可以编辑,但问题的主体实际上是询问如何构建查询字符串而不是解析查询字符串。这种混乱是由于作者最初的方法,即滥用“ParseQueryString”方法来获取内部类“HttpValueCollection”的实例,该类恰好也是一个非常方便的查询生成器。我不完全确定作者是否知道这是他们在做的事情,或者对它不屑一顾,称之为JFM。我无法提供答案,因为它(错误地)标记为dupe,但下面是我正在做的。我希望它能帮助别人。私有字典ParseQueryString(字符串url){var querystring=url.Substring(url.IndexOf('?')+1);var pairs=querystring.Split('&');var dict=pairs.Select(pair=>{var valuePair=pair.Split('=');返回新的KeyValuePair(valuePair[0],valuePair[1]);})。ToDictionary((kvp)=>kvp.Key,(kvp)=>kvp.Value);返回dict;}
// 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());