NameValueCollection to URL Query? NameValueCollection to URL Query? asp.net asp.net

NameValueCollection to URL Query?


Simply calling ToString() on the NameValueCollection will return the name value pairs in a name1=value1&name2=value2 querystring ready format. Note that NameValueCollection types don't actually support this and it's misleading to suggest this, but the behavior works here due to the internal type that's actually returned, as explained below.

Thanks to @mjwills for pointing out that the HttpUtility.ParseQueryString method actually returns an internal HttpValueCollection object rather than a regular NameValueCollection (despite the documentation specifying NameValueCollection). The HttpValueCollection automatically encodes the querystring when using ToString(), so there's no need to write a routine that loops through the collection and uses the UrlEncode method. The desired result is already returned.

With the result in hand, you can then append it to the URL and redirect:

var nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString());string url = Request.Url.AbsolutePath + "?" + nameValues.ToString();Response.Redirect(url);

Currently the only way to use a HttpValueCollection is by using the ParseQueryString method shown above (other than reflection, of course). It looks like this won't change since the Connect issue requesting this class be made public has been closed with a status of "won't fix."

As an aside, you can call the Add, Set, and Remove methods on nameValues to modify any of the querystring items before appending it. If you're interested in that see my response to another question.


string q = String.Join("&",             nvc.AllKeys.Select(a => a + "=" + HttpUtility.UrlEncode(nvc[a])));


Make an extension method that uses a couple of loops. I prefer this solution because it's readable (no linq), doesn't require System.Web.HttpUtility, and it handles duplicate keys.

public static string ToQueryString(this NameValueCollection nvc){    if (nvc == null) return string.Empty;    StringBuilder sb = new StringBuilder();    foreach (string key in nvc.Keys)    {        if (string.IsNullOrWhiteSpace(key)) continue;        string[] values = nvc.GetValues(key);        if (values == null) continue;        foreach (string value in values)        {            sb.Append(sb.Length == 0 ? "?" : "&");            sb.AppendFormat("{0}={1}", Uri.EscapeDataString(key), Uri.EscapeDataString(value));        }    }    return sb.ToString();}

Example

var queryParams = new NameValueCollection(){    { "order_id", "0000" },    { "item_id", "1111" },    { "item_id", "2222" },    { null, "skip entry with null key" },    { "needs escaping", "special chars ? = &" },    { "skip entry with null value", null }};Console.WriteLine(queryParams.ToQueryString());

Output

?order_id=0000&item_id=1111&item_id=2222&needs%20escaping=special%20chars%20%3F%20%3D%20%26