Thursday, July 22, 2004

Url Manipulation (C#)

Edit (25-Mar-2005): Newer version here: Url Manipulation v2 (C#).

This class enables you to manipulate and get the QueryString of a page. It also returns the current page's AbsoluteUri (i.e. /path/to/myfile.aspx?param=test), base Url (i.e. /path/to/myfile.aspx) and virtual folder (i.e. /path/to/)

Use:

UrlQuery MyQuery;
private void Page_Load(object sender, EventArgs e) {
 MyQuery = new UrlQuery("/path/to/myfile.aspx?param=test");
 // or to get the current page use:
 // MyQuery = new UrlQuery()
 Trace.Write(MyQuery.Url); // returns '/path/to/file.aspx'
 Trace.Write(MyQuery.VirtualFolder); // returns '/path/to/'
 Trace.Write(MyQuery.Get()); // returns '?param=test'
 // change query
 MyQuery.Set("param2","value2");
 Trace.Write(MyQuery.Get()); // returns '?param=test¶m2=value2'
 // remove 'param' paramater
 MyQuery.Set("param",null);
 Trace.Write(MyQuery.Get("param2")); // returns 'value2'
 Trace.Write(MyQuery.AbsoluteUri);
 // go to new page
 Trace.Write(MyQuery.VirtualFolder + "file2.aspx" + MyQuery.Get()); // returns '/path/to/file2.aspx?param2=value2'
}

The class 'MyQuery' is based on:

public class UrlQuery
{
 /// <summary>
 /// Base on current page
 /// </summary>
 public UrlQuery()
 {
  url = HttpContext.Current.Request.Url.AbsolutePath;
 }
 /// <summary>
 /// Base on other page
 /// </summary>
 /// <param name="value">The url of the page to reference, i.e.: '/path/to/folder/page.aspx?param1=1&param2=2'</param>
 public UrlQuery(string value)
 {
  int q = value.IndexOf('?');
  if (q != -1)
  {
   url = value.Substring(0, q);
   queryString = NameValueCollection(value);
  }
  else
  {
   url = value;
  }
 }

 private string url;
 /// <summary>
 /// The Url of the page, without QueryString
 /// </summary>
 /// <value>/path/to/folder/page.aspx</value>
 public string Url
 {
  get
  {
   return url;
  }
 }
 /// <summary>
 /// Returns the virtual folder the page is in
 /// </summary>
 /// <value>/path/to/folder/</value>
 public string VirtualFolder
 {
  get
  {
   return Url.Substring(0, Url.LastIndexOf("/") + 1);
  }
 }
 /// <summary>
 /// The AbsoluteUri
 /// </summary>
 /// <value>page.aspx?param1=1¶m2=2</value>
 public string AbsoluteUri
 {
  get
  {
   return Url + Get();
  }
 }
 private NameValueCollection queryString;
 /// <summary>
 /// Get the QueryString for the page
 /// </summary>
 public NameValueCollection QueryString
 {
  get
  {
   if (queryString != null)
   {
    return queryString;
   }
   else
   {
    queryString = new NameValueCollection(HttpContext.Current.Request.QueryString);
    return queryString;
   }
  }
 }
 /// <summary>
 /// Get the QueryString
 /// </summary>
 /// <returns>String in the format ?param1=1&param2=2</returns>
 public string Get()
 {
  string query = "";
  if (QueryString.Count != 0)
  {
   query = "?";
   for (int i = 0; i <= QueryString.Count - 1; i++)
   {
    if (i != 0)
    {
     query += "&";
    }
    query += QueryString.GetKey(i) + "=" + QueryString.Get(i);
   }
  }
  return query;
 }
 /// <summary>
 /// Get parameter from QueryString
 /// </summary>
 /// <param name="param">Parameter to get</param>
 /// <returns>Parameter Value</returns>
 public string Get(string param)
 {
  return QueryString[param];
 }
 /// <summary>
 /// Set QueryString parameter
 /// </summary>
 /// <param name="param">Parameter to set</param>
 /// <param name="value">Value of parameter</param>
 public void Set(string param, string value)
 {
  if (param != string.Empty)
  {
   if (value == string.Empty || value == null)
   {
    QueryString.Remove(param);
   }
   else
   {
    QueryString[param] = value;
   }
  }
 }
 /// <summary>
 /// Convert QueryString string to NameValueCollection
 /// http://groups.google.co.uk/groups?hl=en&lr=&ie=UTF-8&safe=off&selm=uyMZ2oaZDHA.652%40tk2msftngp13.phx.gbl
 /// </summary>
 public static NameValueCollection NameValueCollection(string qs)
 {
  NameValueCollection nvc = new NameValueCollection();
  //strip string data before the question mark
  qs = qs.IndexOf('?') > 0 ? qs.Remove(0, qs.IndexOf('?') + 1) : qs;
  Array sqarr = qs.Split("&".ToCharArray());
  for (int i = 0; i < sqarr.Length; i++)
  {
   string[] pairs = sqarr.GetValue(i).ToString().Split("=".ToCharArray());
   nvc.Add(pairs[0], pairs[1]);
  }
  return nvc;
 }
 /// <summary>
 /// Copies a form paramater to the QueryString
 /// </summary>
 /// <param name="param">Form Parameter</param>
 public void FormToQuery(string param)
 {

  this.Set(param, HttpContext.Current.Request.Form[param]);
 }
}

Edit (25-Jul-2004): can pass on page url as a parameter (leave blank for current page)

Edit (27-Jul-2004): can copy a form elements value to the QueryString on postback. i.e.

void Button1_Click(object sender, EventArgs e)
{
 // transfer form parameter to query
 MyQuery.FormToQuery("mytextbox");
 Trace.Write(MyQuery.Get());
}

Tags: , ,

2 comments:

nontalk said...

Thanks a lot man! I am going to try this out.

Sam said...

There is a newer version:
Url Manipulation v2 (C#)