Я надеялся найти решение, встроенное в фреймворк, но не смог. (те методы, которые находятся в фреймворке, требуют много работы, чтобы сделать его простым и чистым)
После попытки нескольких альтернатив я в настоящее время использую следующий метод расширения: (опубликуйте лучшее решение или комментарий, если у вас есть)
public static class UriExtensions
{
public static Uri AddQuery(this Uri uri, string name, string value)
{
string newUrl = uri.OriginalString;
if (newUrl.EndsWith("&") || newUrl.EndsWith("?"))
newUrl = string.Format("{0}{1}={2}", newUrl, name, value);
else if (newUrl.Contains("?"))
newUrl = string.Format("{0}&{1}={2}", newUrl, name, value);
else
newUrl = string.Format("{0}?{1}={2}", newUrl, name, value);
return new Uri(newUrl);
}
}
Этот метод расширения обеспечивает очень чистое перенаправление и манипуляции с URI:
Response.Redirect(Request.Url.AddQuery("ProductID", productId).ToString());
// Will generate a URL of www.google.com/search?q=asp.net
var url = new Uri("www.google.com/search").AddQuery("q", "asp.net")
и будет работать для следующих URL:
"http://www.google.com/somepage"
"http://www.google.com/somepage?"
"http://www.google.com/somepage?OldQuery=Data"
"http://www.google.com/somepage?OldQuery=Data&"