Modify the querystring of the current URL (or a passed in URL) to either add, update or remove parameters.
public static class UrlHelperExtensions
{
public static string ModifyQueryString(this UrlHelper helper, NameValueCollection updates, IEnumerable<string> removes)
{
return ModifyQueryString(helper, null, updates, removes);
}
public static string ModifyQueryString(this UrlHelper helper, string url, NameValueCollection updates, IEnumerable<string> removes)
{
NameValueCollection query;
var request = helper.RequestContext.HttpContext.Request;
if (string.IsNullOrWhiteSpace(url))
{
url = request.Url.AbsolutePath;
query = HttpUtility.ParseQueryString(request.QueryString.ToString());
}
else
{
var urlParts = url.Split('?');
url = urlParts[0];
if (urlParts.Length > 1)
{
query = HttpUtility.ParseQueryString(urlParts[1]);
}
else
{
query = new NameValueCollection();
}
}
updates = updates ?? new NameValueCollection();
foreach (string key in updates.Keys)
{
query.Set(key, updates[key]);
}
removes = removes ?? new List<string>();
foreach (string param in removes)
{
query.Remove(param);
}
if (query.HasKeys())
{
return string.Format("{0}?{1}", url, query.ToString());
}
else
{
return url;
}
}
public static string UpdateQueryParam(this UrlHelper helper, string param, object value)
{
return ModifyQueryString(helper, new NameValueCollection { { param, value.ToString() } }, null);
}
public static string UpdateQueryParam(this UrlHelper helper, string url, string param, object value)
{
return ModifyQueryString(helper, url, new NameValueCollection { { param, value.ToString() } }, null);
}
public static string RemoveQueryParam(this UrlHelper helper, string param)
{
return ModifyQueryString(helper, null, new List<string> { param });
}
public static string UpdateQueryParams(this UrlHelper helper, NameValueCollection updates)
{
return ModifyQueryString(helper, updates, null);
}
public static string RemoveQueryParams(this UrlHelper helper, List<string> removes)
{
return ModifyQueryString(helper, null, removes);
}
}
//
// Example
//
Url.UpdateQueryParam("page", 4);
Url.RemoveQueryParam("q");