我希望能够通过将键和值添加到某个帮助程序类来构建URL查询字符串,并将其作为URL查询返回。我知道这可以这样做:
var queryBuilder= HttpUtility.ParseQueryString("http://baseurl.com/?");
queryBuilder.Add("Key", "Value");
string url = queryBuilder.ToString();
这正是我追求的行为。但是,这个类存在于着名的大System.Web
中,我宁愿不为此带来整个库。某处有替代方案吗?
答案 0 :(得分: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);
}
}
您可以使用此扩展来构建如下的查询字符串:
// 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());