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

19

我希望能够通过向一些辅助类添加键和值来构建URL查询字符串,并将其作为URL查询返回。我知道这是可行的,例如:

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

这正是我想要的行为。然而,这个类存在于众所周知的大型System.Web中,我不想为此引入整个库。有其他替代方案吗?


尝试使用 System.Uri:http://msdn.microsoft.com/pl-pl/library/system.uri%28v=vs.110%29.aspx - user2160375
1
你为什么关心System.Web的大小?它已经在框架中部署了。 - fixagon
1
如果您查看源代码,解析/转换为字符串的代码非常简单,没有额外依赖于System.Web;例如:http://referencesource.microsoft.com/#System.Web/HttpValueCollection.cs,222f9a1bfd1f9a98 - Alex K.
pwas,我不认为/看不到System.Uri类允许像我展示的那样添加查询参数。lem2802你链接中的解决方案都使用HttpUtility..?fix_likes_coding,有很多原因我或其他人都不想引用它,比如将代码部署为包时不想要额外的依赖项。 - MartinM
3
这不是重复问题。它明确要求如何在不使用“System.Web”的情况下执行此操作,而其他问题是通过使用该方法来处理的。 - Jonathan Allen
显示剩余4条评论
1个回答

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

1
使用WebUtility.UrlEncode()将“key”和“value”包围起来。 - Seva Alekseyev
@SevaAlekseyev - 做得好,提出了不错的建议 :) - Adam Rhodes
2
为什么这被标记为正确答案,当它完全相反于ParseQueryString的作用? - Jonathan Allen
@JonathanAllen 嗯,标题不太好,需要编辑一下,但问题的主体实际上是在问如何构建查询字符串而不是解析一个。这种混淆是由于作者最初的方法是滥用“ParseQueryString”方法来获取内部类“HttpValueCollection”的实例,后者恰好也是一个非常方便的查询构建器。我不确定作者是否知道自己在做什么,或者只是随意处理了一下。 - Adam Rhodes
谢谢。对于Unity 3D来说,这个解决方案是必不可少的,因为它没有实现 HttpUtility。 - Guney Ozsan
2
我无法提供答案,因为它被错误地标记为重复问题,但这是我正在做的事情。希望能对某些人有所帮助。private Dictionary ParseQueryString(string url) { var querystring = url.Substring(url.IndexOf('?') + 1); var pairs = querystring.Split('&'); var dict = pairs.Select(pair => { var valuePair = pair.Split('='); return new KeyValuePair(valuePair[0], valuePair[1]); }) .ToDictionary((kvp) => kvp.Key, (kvp) => kvp.Value); return dict; } - spassvogel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接