Url Manipulation v2 (C#)
Made some improvements to the previous UrlQuery class (July 22nd, 2004). It now has a shorter way of assigning QueryString parameters:
MyQuery = new UrlQuery(); // add another parameter (or replace existing one) MyQuery["myparam"] = "myval"; Trace.Write(MyQuery["myparam"]); // returns 'myval' // remove parameter MyQuery["myparam"] = null; // or string.Empty Trace.Write(MyQuery["myparam"]); // returns ''
UrlQuery class code:
public class UrlQuery
{
/// <summary>
/// Base on current page
/// </summary>
public UrlQuery()
{
this.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¶m2=2'</param>
public UrlQuery(string value)
{
int q = value.IndexOf('?');
if (q != -1)
{
this.url = value.Substring(0, q);
this.queryString = NameValueCollection(value);
}
else
{
this.url = value;
}
}
/// <summary>
/// Get and set Url parameters
/// </summary>
public string this[string param]
{
get
{
return this.Get(param);
}
set
{
this.Set(param,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 this.url;
}
}
/// <summary>
/// Returns the virtual folder the page is in
/// </summary>
/// <value>/path/to/folder/</value>
public string VirtualFolder
{
get
{
return this.Url.Substring(0, Url.LastIndexOf("/") + 1);
}
}
/// <summary>
/// The AbsoluteUri
/// </summary>
/// <value>page.aspx?param1=1¶m2=2</value>
public string AbsoluteUri
{
get
{
return this.Url + this.Get();
}
}
private NameValueCollection queryString;
/// <summary>
/// Get the QueryString for the page
/// </summary>
public NameValueCollection QueryString
{
get
{
if (this.queryString != null)
{
return this.queryString;
}
else
{
this.queryString = new NameValueCollection(HttpContext.Current.Request.QueryString);
return this.queryString;
}
}
}
/// <summary>
/// Get the QueryString
/// </summary>
/// <returns>String in the format ?param1=1¶m2=2</returns>
public string Get()
{
string query = "";
if (this.QueryString.Count != 0)
{
query = "?";
for (int i = 0; i <= this.QueryString.Count - 1; i++)
{
if (i != 0)
{
query += "&";
}
query += this.QueryString.GetKey(i) + "=" + this.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 this.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)
{
this.QueryString.Remove(param);
}
else
{
this.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]);
}
}
Comments
Hopefully will get a chance to update this, but can't give any guarantees on when (don't have much free time at the moment).