given is an URL like http://localhost:1973/Services.aspx?idProject=10&idService=14
.
What is the most straightforward way to replace both url-paramet
Here is my implementation:
using System;
using System.Collections.Specialized;
using System.Web; // For this you need to reference System.Web assembly from the GAC
public static class UriExtensions
{
public static Uri SetQueryVal(this Uri uri, string name, object value)
{
NameValueCollection nvc = HttpUtility.ParseQueryString(uri.Query);
nvc[name] = (value ?? "").ToString();
return new UriBuilder(uri) {Query = nvc.ToString()}.Uri;
}
}
and here are some examples:
new Uri("http://host.com/path").SetQueryVal("par", "val")
// http://host.com/path?par=val
new Uri("http://host.com/path?other=val").SetQueryVal("par", "val")
// http://host.com/path?other=val&par=val
new Uri("http://host.com/path?PAR=old").SetQueryVal("par", "new")
// http://host.com/path?PAR=new
new Uri("http://host.com/path").SetQueryVal("par", "/")
// http://host.com/path?par=%2f
new Uri("http://host.com/path")
.SetQueryVal("p1", "v1")
.SetQueryVal("p2", "v2")
// http://host.com/path?p1=v1&p2=v2
This is what I would do:
public static class UrlExtensions
{
public static string SetUrlParameter(this string url, string paramName, string value)
{
return new Uri(url).SetParameter(paramName, value).ToString();
}
public static Uri SetParameter(this Uri url, string paramName, string value)
{
var queryParts = HttpUtility.ParseQueryString(url.Query);
queryParts[paramName] = value;
return new Uri(url.AbsoluteUriExcludingQuery() + '?' + queryParts.ToString());
}
public static string AbsoluteUriExcludingQuery(this Uri url)
{
return url.AbsoluteUri.Split('?').FirstOrDefault() ?? String.Empty;
}
}
Usage:
string oldUrl = "http://localhost:1973/Services.aspx?idProject=10&idService=14";
string newUrl = oldUrl.SetUrlParameter("idProject", "12").SetUrlParameter("idService", "7");
Or:
Uri oldUrl = new Uri("http://localhost:1973/Services.aspx?idProject=10&idService=14");
Uri newUrl = oldUrl.SetParameter("idProject", "12").SetParameter("idService", "7");
The most robust way would be to use the Uri class to parse the string, change te param values and then build the result.
There are many nuances to how URLs work and while you could try to roll your own regex to do this it could quickly get complicate handling all the cases.
All the other methods would have issues with substring matches etc and I don't even see how Linq applies here.
I found this in an old code example, wouldnt take much to improve it, taking a IEnumerable<KeyValuePair<string,object>>
may be better than the current delimeted string.
public static string AppendQuerystring( string keyvalue)
{
return AppendQuerystring(System.Web.HttpContext.Current.Request.RawUrl, keyvalue);
}
public static string AppendQuerystring(string url, string keyvalue)
{
string dummyHost = "http://www.test.com:80/";
if (!url.ToLower().StartsWith("http"))
{
url = String.Concat(dummyHost, url);
}
UriBuilder builder = new UriBuilder(url);
string query = builder.Query;
var qs = HttpUtility.ParseQueryString(query);
string[] pts = keyvalue.Split('&');
foreach (string p in pts)
{
string[] pts2 = p.Split('=');
qs.Set(pts2[0], pts2[1]);
}
StringBuilder sb = new StringBuilder();
foreach (string key in qs.Keys)
{
sb.Append(String.Format("{0}={1}&", key, qs[key]));
}
builder.Query = sb.ToString().TrimEnd('&');
string ret = builder.ToString().Replace(dummyHost,String.Empty);
return ret;
}
Usage
var url = AppendQueryString("http://localhost:1973/Services.aspx?idProject=10&idService=14","idProject=12&idService=17");
the C# HttpUtility.ParseQueryString utility will do the heavy lifting for you. You will want to do some more robust null checking in your final version.
// Let the object fill itself
// with the parameters of the current page.
var qs = System.Web.HttpUtility.ParseQueryString(Request.RawUrl);
// Read a parameter from the QueryString object.
string value1 = qs["name1"];
// Write a value into the QueryString object.
qs["name1"] = "This is a value";
The most straightforward way is String.Replace
, but you'll end up with problems if your uri looks like http://localhost:1212/base.axd?id=12&otherId=12