Tutorial :Get url parameters from a string in .NET


I've got a string in .NET which is actually a url. I want an easy way to get the value from a particular parameter.

Normally, I'd just use Request.Params["theThingIWant"], but this string isn't from the request. I can create a new Uri item like so:

Uri myUri = new Uri(TheStringUrlIWantMyValueFrom);  

I can use myUri.Query to get the query string...but then I apparently have to find some regexy way of splitting it up.

Am I missing something obvious, or is there no built in way to do this short of creating a regex of some kind, etc?


Use static ParseQueryString method of System.Web.HttpUtility class that returns NameValueCollection.

Uri myUri = new Uri("http://www.example.com?param1=good&param2=bad");  string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("param1");  

Check documentation at http://msdn.microsoft.com/en-us/library/ms150046.aspx


This is probably what you want

var uri = new Uri("http://domain.test/Default.aspx?var1=true&var2=test&var3=3");  var query = HttpUtility.ParseQueryString(uri.Query);    var var2 = query.Get("var2");  


Here's another alternative if, for any reason, you can't or don't want to use HttpUtility.ParseQueryString().

This is built to be somewhat tolerant to "malformed" query strings, i.e. http://test/test.html?empty= becomes a parameter with an empty value. The caller can verify the parameters if needed.

public static class UriHelper  {      public static Dictionary<string, string> DecodeQueryParameters(this Uri uri)      {          if (uri == null)              throw new ArgumentNullException("uri");            if (uri.Query.Length == 0)              return new Dictionary<string, string>();            return uri.Query.TrimStart('?')                          .Split(new[] { '&', ';' }, StringSplitOptions.RemoveEmptyEntries)                          .Select(parameter => parameter.Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries))                          .GroupBy(parts => parts[0],                                   parts => parts.Length > 2 ? string.Join("=", parts, 1, parts.Length - 1) : (parts.Length > 1 ? parts[1] : ""))                          .ToDictionary(grouping => grouping.Key,                                        grouping => string.Join(",", grouping));      }  }  


[TestClass]  public class UriHelperTest  {      [TestMethod]      public void DecodeQueryParameters()      {          DecodeQueryParametersTest("http://test/test.html", new Dictionary<string, string>());          DecodeQueryParametersTest("http://test/test.html?", new Dictionary<string, string>());          DecodeQueryParametersTest("http://test/test.html?key=bla/blub.xml", new Dictionary<string, string> { { "key", "bla/blub.xml" } });          DecodeQueryParametersTest("http://test/test.html?eins=1&zwei=2", new Dictionary<string, string> { { "eins", "1" }, { "zwei", "2" } });          DecodeQueryParametersTest("http://test/test.html?empty", new Dictionary<string, string> { { "empty", "" } });          DecodeQueryParametersTest("http://test/test.html?empty=", new Dictionary<string, string> { { "empty", "" } });          DecodeQueryParametersTest("http://test/test.html?key=1&", new Dictionary<string, string> { { "key", "1" } });          DecodeQueryParametersTest("http://test/test.html?key=value?&b=c", new Dictionary<string, string> { { "key", "value?" }, { "b", "c" } });          DecodeQueryParametersTest("http://test/test.html?key=value=what", new Dictionary<string, string> { { "key", "value=what" } });          DecodeQueryParametersTest("http://www.google.com/search?q=energy+edge&rls=com.microsoft:en-au&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1%22",              new Dictionary<string, string>              {                  { "q", "energy+edge" },                  { "rls", "com.microsoft:en-au" },                  { "ie", "UTF-8" },                  { "oe", "UTF-8" },                  { "startIndex", "" },                  { "startPage", "1%22" },              });          DecodeQueryParametersTest("http://test/test.html?key=value;key=anotherValue", new Dictionary<string, string> { { "key", "value,anotherValue" } });      }        private static void DecodeQueryParametersTest(string uri, Dictionary<string, string> expected)      {          Dictionary<string, string> parameters = new Uri(uri).DecodeQueryParameters();          Assert.AreEqual(expected.Count, parameters.Count, "Wrong parameter count. Uri: {0}", uri);          foreach (var key in expected.Keys)          {              Assert.IsTrue(parameters.ContainsKey(key), "Missing parameter key {0}. Uri: {1}", key, uri);              Assert.AreEqual(expected[key], parameters[key], "Wrong parameter value for {0}. Uri: {1}", parameters[key], uri);          }      }  }  


Looks like you should loop over the values of myUri.Query and parse it from there.

 string desiredValue;   foreach(string item in myUri.Query.Split('&'))   {       string[] parts = item.Replace('?', '').Split('=');       if(parts[0] == "desiredKey")       {           desiredValue = parts[1];           break;       }   }  

I wouldn't use this code without testing it on a bunch of malformed URLs however. It might break on some/all of these:

  • hello.html?
  • hello.html?valuelesskey
  • hello.html?key=value=hi
  • hello.html?hi=value?&b=c
  • etc


@Andrew and @CZFox

I had the same bug and found the cause to be that parameter one is in fact: http://www.example.com?param1 and not param1 which is what one would expect.

By removing all characters before and including the question mark fixes this problem. So in essence the HttpUtility.ParseQueryString function only requires a valid query string parameter containing only characters after the question mark as in:

HttpUtility.ParseQueryString ( "param1=good&param2=bad" )  

My workaround:

string RawUrl = "http://www.example.com?param1=good&param2=bad";  int index = RawUrl.IndexOf ( "?" );  if ( index > 0 )      RawUrl = RawUrl.Substring ( index ).Remove ( 0, 1 );    Uri myUri = new Uri( RawUrl, UriKind.RelativeOrAbsolute);  string param1 = HttpUtility.ParseQueryString( myUri.Query ).Get( "param1" );`  


You can use the following workaround for it to work with the first parameter too:

var param1 =      HttpUtility.ParseQueryString(url.Substring(          new []{0, url.IndexOf('?')}.Max()      )).Get("param1");  


Use .NET Reflector to view the FillFromString method of System.Web.HttpValueCollection. That gives you the code that ASP.NET is using to fill the Request.QueryString collection.




Or if you don't know the URL (so as to avoid hardcoding, use the AbsoluteUri

Example ...

        //get the full URL          Uri myUri = new Uri(Request.Url.AbsoluteUri);          //get any parameters          string strStatus = HttpUtility.ParseQueryString(myUri.Query).Get("status");          string strMsg = HttpUtility.ParseQueryString(myUri.Query).Get("message");          switch (strStatus.ToUpper())          {              case "OK":                  webMessageBox.Show("EMAILS SENT!");                  break;              case "ER":                  webMessageBox.Show("EMAILS SENT, BUT ... " + strMsg);                  break;          }  


if you want in get your QueryString on Default page .Default page means your current page url . you can try this code :

string paramIl = HttpUtility.ParseQueryString(this.ClientQueryString).Get("city");  


I used it and it run perfectly

<%=Request.QueryString["id"] %>  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »