Я хочу динамично заполнить ссылку с URI текущего запроса, но установить один определенный параметр строки запроса. Всех других querystring параматерей (если существует кто-либо) нужно оставить нетронутыми. И я не знаю заранее, каковы они могли бы быть.
Например, предположите, что я хочу создать ссылку назад на текущую страницу, но с querystring параметром "valueOfInterest" всегда набор, чтобы быть "wibble" (я делаю это из кода - позади aspx страницы.Net 3.5 в C# FWIW).
Например, запрос на любой из этих двух:
/somepage.aspx
/somepage.aspx?valueOfInterest=sausages
стал бы:
/somepage.aspx?valueOfInterest=wibble
И самое главное (возможно), запрос на:
/somepage.aspx?boring=something
/somepage.aspx?boring=something&valueOfInterest=sausages
сохранил бы скучные параметрические усилители для становления:
/somepage.aspx?boring=something&valueOfInterest=wibble
Протесты: я хотел бы избежать обработки строк, если существует что-то более изящное в asp.net, который более устойчив. Однако, если нет чего-то более изящного, пусть будет так.
Я сделал (немного) домашней работы: Я нашел сообщение в блоге, которое предложило копировать запрос в локальный объект HttpRequest, но это все еще имеет набор только для чтения для querystring параметрических усилителей. Я также взглянул на использование объекта URI, но это, кажется, не имеет querystring
Это будет работать, пока [1] у вас есть действительный URL для начала (что кажется разумным) [2] вы убедитесь, что ваше новое значение ('сосиски') правильно экранировано. Нет никакого синтаксического анализа, единственная манипуляция строкой - это объединение параметров.
Правка
Вот C #:
UriBuilder u = new UriBuilder(Request.Url);
NameValueCollection nv = new NameValueCollection(Request.QueryString);
/* A NameValueColllection automatically makes room if this is a new
name. You don't have to check for NULL.
*/
nv["valueOfInterest"] = "sausages";
/* Appending to u.Query doesn't quite work, it
overloaded to add an extra '?' each time. Have to
use StringBuilder instead.
*/
StringBuilder newQuery = new StringBuilder();
foreach (string k in nv.Keys)
newQuery.AppendFormat("&{0}={1}", k, nv[k]);
u.Query = newQuery.ToString();
Response.Redirect(u.Uri.ToString());
UriBuilder u = new UriBuilder(Request.Url);
NameValueCollection nv = new NameValueCollection(Request.QueryString);
nv["valueofinterest"] = "wibble";
string newQuery = "";
foreach (string k in nv.Keys)
{
newQuery += k + "=" + nv[k] + "&";
}
u.Query = newQuery.Substring(0,newQuery.Length-1);
Response.Redirect(u.ToString());
, который должен сделать это
Если вы не можете найти что-то существующее, чтобы сделать это, создайте пуленепробиваемую функцию, которая будет делать это, которая будет тщательно протестирована и на которую можно положиться. Если при этом используется манипуляция со строками, но он эффективен и полностью протестирован, то в действительности он будет мало отличаться от того, что вы можете найти в любом случае.