asp.netquery-stringuri

ASP.NET: URI handling


I'm writing a method which, let's say, given 1 and hello should return http://something.com/?something=1&hello=en.

I could hack this together pretty easily, but what abstraction functionality does ASP.NET 3.5 provide for building URIs? I'd like something like:

URI uri = new URI("~/Hello.aspx"); // E.g. ResolveUrl is used here
uri.QueryString.Set("something", "1");
uri.QueryString.Set("hello", "en");
return uri.ToString(); // /Hello.aspx?something=1&hello=en

I found the Uri class which sounds highly relevant, but I can't find anything which does the above really. Any ideas?

(For what it's worth, the order of the parameters doesn't matter to me.)


Solution

  • Edited to correct massively incorrect code

    Based on this answer to a similar question you could easily do something like:

    UriBuilder ub = new UriBuilder();
    
    // You might want to take more care here, and set the host, scheme and port too
    ub.Path = ResolveUrl("~/hello.aspx"); // Assumes we're on a page or control.
    
    // Using var gets around internal nature of HttpValueCollection
    var coll = HttpUtility.ParseQueryString(string.Empty);
    
    coll["something"] = "1";
    coll["hello"] = "en";
    
    ub.Query = coll.ToString();
    return ub.ToString();
    // This returned the following on the VS development server:
    // http://localhost/Hello.aspx?something=1&hello=en
    

    This will also urlencode the collection, so:

    coll["Something"] = "1";
    coll["hello"] = "en&that";
    

    Will output:

    Something=1&hello=en%26that