Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.)

like image 539
Deniz Dogan Avatar asked Nov 29 '22 19:11

Deniz Dogan


2 Answers

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 
like image 112
Zhaph - Ben Duguid Avatar answered Dec 04 '22 23:12

Zhaph - Ben Duguid


As far I know nothing here. So everybody has its own implementation.

Example from LinqToTwitter.

    internal static string BuildQueryString(IEnumerable<KeyValuePair<string, string>> parameters)
    {
        if (parameters == null)
        {
            throw new ArgumentNullException("parameters");
        }

        StringBuilder builder = new StringBuilder();
        foreach (var pair in parameters.Where(p => !string.IsNullOrEmpty(p.Value)))
        {
            if (builder.Length > 0)
            {
                builder.Append("&");
            }

            builder.Append(Uri.EscapeDataString(pair.Key));
            builder.Append("=");
            builder.Append(Uri.EscapeDataString(pair.Value));
        }

        return builder.ToString();
    }

UPDATE:

You can also create extension method:

public static UriBuilder AddArgument(this UriBuilder builder, string key, string value)
{
 #region Contract

 Contract.Requires(builder != null);
 Contract.Requires(key != null);
 Contract.Requires(value != null);

 #endregion

 var query = builder.Query;

 if (query.Length > 0)
 {
      query = query.Substring(1) + "&";
 } 

 query += Uri.EscapeDataString(key) + "="
      + Uri.EscapeDataString(value);

 builder.Query = query;

 return builder;
}

And usage:

var b = new UriBuilder();
b.AddArgument("test", "test");

Please note that everything here is untested.

like image 20
Mike Chaliy Avatar answered Dec 04 '22 23:12

Mike Chaliy