Измените запрос querystring параметры для создания новой ссылки, не обращаясь к обработке строк

Я хочу динамично заполнить ссылку с 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

6
задан egrunin 10 September 2012 в 15:16
поделиться

3 ответа

Это будет работать, пока [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());
6
ответ дан 17 December 2019 в 00:06
поделиться
        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());

, который должен сделать это

1
ответ дан 17 December 2019 в 00:06
поделиться

Если вы не можете найти что-то существующее, чтобы сделать это, создайте пуленепробиваемую функцию, которая будет делать это, которая будет тщательно протестирована и на которую можно положиться. Если при этом используется манипуляция со строками, но он эффективен и полностью протестирован, то в действительности он будет мало отличаться от того, что вы можете найти в любом случае.

0
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: