Outputting a manipulated QueryString in C#
Asked Answered
S

6

23

Using the following code I get a nice formatted string:

Request.QueryString.ToString 

Gives me something like: &hello=world&microsoft=sucks

But when I use this code to clone the collection to another object (of the same type) I get the Type() back from the ToString() method instead.

System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (!string.IsNullOrEmpty(variables["sid"]))
    variables.Remove("sid");
Response.Write(variables.ToString());

Is there a tidier way to output it rather than looking and building the string manually?

Stubbed answered 23/10, 2008 at 14:22 Comment(2)
IF microsoft suck like you wrote in the example, why do you use Microsoft technology?Scrannel
I was joking chillStubbed
M
8

You can also use Reflector to extract the HttpValueCollection class into your own, and use it then.

Militate answered 23/10, 2008 at 14:35 Comment(5)
I'm giving you the win here hmemcpy as its probably the most appropriate but it doesnt solve my problem, guess I'll just have to do it the dirty wayStubbed
Actually, you pretty much just need the HttpValueCollection.ToString(bool urlencoded, IDictionary excludeKeys) method.Dymoke
Yup, just like James said, the HttpValueCollection overrides ToString() to create the query string with HttpEncoded values and ampersands. You can use Add/Remove on the values, and later call ToString() to create your new query string.Militate
Can you tell me about Reflector ? is it the software which you can see the assemblies or something different?Zelaya
Yes Reflector lets you open .net Dll's/Exes and will do test to reproduce the code in it, there are plugins which will allow you to do other things like disassemble to a projectStubbed
S
69

HttpValueCollection is internal, but you can use "var" to declare it without extract it with reflector.

var query = HttpUtility.ParseQueryString(Request.Url.Query);
query["Lang"] = myLanguage; // Add or replace param
string myNewUrl = Request.Url.AbsolutePath + "?" + query;
Snappy answered 15/9, 2009 at 7:43 Comment(7)
Nice idea! But var isn't doing anything for you here, that's just virtual method dispatch. NameValueCollection values = HttpUtility.ParseQueryString(...) will work just as well. Also I'd add a comment to explain what you're doing.Martz
Also HttpUtility.ParseQueryString("") works nicely if you want an empty one.Martz
+1. ¿But why not NameValueCollection instead of var? BTW, it works for me.Lonergan
We can use either Request.Url.Query or Request.QueryString.ToString(). I guess Request.Url.Query has a better performance. The only difference between these two is Request.Url.Query return a question mark ? in front, but fortunately HttpUtility.ParseQueryString() doesn't care.Athalia
This answer should really just say 'to get a mutable query string object (NameValueCollection) you can use HttpUtility.ParseQueryString', no?Skysweeper
Just cut about 12 lines of code thanks to this. Combine it with Uri.GetLeftPart and you're golden. var query = HttpUtility.ParseQueryString(request.Url.Query); query.Remove("code"); var myNewUrl = request.Url.GetLeftPart(UriPartial.Path) + "?" + query;Witchy
var keyword in C# is syntactic sugar. NameValueCollection values = ... and var values = ... produces the exact same and identical IL. var says to the compiler "the left part of the assignment is of the same type as the right part".Halla
M
8

You can also use Reflector to extract the HttpValueCollection class into your own, and use it then.

Militate answered 23/10, 2008 at 14:35 Comment(5)
I'm giving you the win here hmemcpy as its probably the most appropriate but it doesnt solve my problem, guess I'll just have to do it the dirty wayStubbed
Actually, you pretty much just need the HttpValueCollection.ToString(bool urlencoded, IDictionary excludeKeys) method.Dymoke
Yup, just like James said, the HttpValueCollection overrides ToString() to create the query string with HttpEncoded values and ampersands. You can use Add/Remove on the values, and later call ToString() to create your new query string.Militate
Can you tell me about Reflector ? is it the software which you can see the assemblies or something different?Zelaya
Yes Reflector lets you open .net Dll's/Exes and will do test to reproduce the code in it, there are plugins which will allow you to do other things like disassemble to a projectStubbed
E
4

Because it is actually a special NVC that is of type HTTPValueCollection. So when you call .ToString on it, it knows how to format it correctly.

Embow answered 23/10, 2008 at 14:32 Comment(0)
O
2

Why do you want to copy the QueryString collection into a new NameValueCollection?

    if (!string.IsNullOrEmpty(Request.QueryString["sid"]))
        Request.QueryString.Remove("sid");

Yes indeed, i am wrong, it is read only. So the essence is to use the Remove Method on your NameValuecollection:

System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (!string.IsNullOrEmpty(variables["sid"]))
    variables.Remove("sid");
Overdone answered 23/10, 2008 at 14:30 Comment(1)
Because I cannot remove from the Querystring collection as it is readonlyStubbed
L
1

If you don't absolutely need a NameValueCollection, A dictionary offers a lot of the same semantics:

var variables = Request.QueryString.OfType<DictionaryEntry>()
    .Where(entry => entry.Key != "sid")
    .ToDictionary(entry => entry.Key, entry => entry.Value);
Landmass answered 23/10, 2008 at 15:7 Comment(1)
I think this won't work on query strings with duplicate keys.Gland
D
0

Request.QueryString actually return a HttpValueCollection object (which unfortuately, is internal to System.Web so you can't you it).

Nevertheless, HttpValueCollection is derived from NameValueCollection, and it's Remove() method remains intact, so you should be able to call Request.QueryString.Remove("sid");

Dymoke answered 23/10, 2008 at 14:30 Comment(1)
Unfortunately you can't do that as it is a readonly collectionStubbed

© 2022 - 2024 — McMap. All rights reserved.