Как удалить элементы из строки запроса для перенаправления? - PullRequest
8 голосов
/ 09 сентября 2008

На моей базовой странице мне нужно удалить элемент из строки запроса и перенаправить. Я не могу использовать

Request.QueryString.Remove("foo")

потому что коллекция доступна только для чтения. Есть ли способ получить строку запроса (кроме этого одного элемента), не повторяя коллекцию и не перестраивая ее?

Ответы [ 10 ]

10 голосов
/ 27 октября 2009

Вы можете избежать прикосновения к исходной строке запроса, вместо этого работая с ее копией. Затем вы можете перенаправить страницу на URL-адрес, содержащий вашу измененную строку запроса, например:

    var nvc = new NameValueCollection();

    nvc.Add(HttpUtility.ParseQueryString(Request.Url.Query));

    nvc.Remove("foo");

    string url = Request.Url.AbsolutePath;

    for (int i = 0; i < nvc.Count; i++)
        url += string.Format("{0}{1}={2}", (i == 0 ? "?" : "&"), nvc.Keys[i], nvc[i]);

    Response.Redirect(url);

Обновление:

Оказывается, мы можем упростить код следующим образом:

    var nvc = HttpUtility.ParseQueryString(Request.Url.Query);

    nvc.Remove("foo");

    string url = Request.Url.AbsolutePath + "?" + nvc.ToString();

    Response.Redirect(url);
8 голосов
/ 09 сентября 2008

Вы должны восстановить URL, а затем перенаправить. Примерно так:

string url = Request.RawUrl;

NameValueCollection params = Request.QueryString;
for (int i=0; i<params.Count; i++)
{
    if (params[i].GetKey(i).ToLower() == "foo")
    {
        url += string.Concat((i==0 ? "?" : "&"), params[i].GetKey(i), "=", params.Get(i));
    }
}
Response.Redirect(url);

Во всяком случае, я не проверял это или что-то еще, но это должно работать (или, по крайней мере, привести вас в правильном направлении)

2 голосов
/ 17 ноября 2011

HttpUtility.ParseQueryString(Request.Url.Query) возврат QueryStringValueCollection. Наследуется от NameValueCollection.

    var qs = HttpUtility.ParseQueryString(Request.Url.Query);
    qs.Remove("foo"); 

    string url = "~/Default.aspx"; 
    if (qs.Count > 0)
       url = url + "?" + qs.ToString();

    Response.Redirect(url); 
2 голосов
/ 09 сентября 2008

Интересный вопрос. Я не вижу реальной реальной альтернативы копированию коллекции вручную, поскольку CopyTo позволит вам получить только значения (а не ключи).

Я думаю, HollyStyles 'Hack сработает (хотя я буду нервничать из-за помещения Replace в QueryString - очевидно, в зависимости от варианта использования), но есть одна вещь, которая беспокоит меня ...

Если целевая страница не читает ее, зачем вам удалять ее из QueryString?

Это будет просто проигнорировано?

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

ОБНОВЛЕНИЕ - После ответа от OP

Ааааа! Теперь я вижу, да, у меня были похожие проблемы с SiteMap при полном сравнении строки.

Поскольку об изменении другого исходного кода (т. Е. Поиска) не может быть и речи, я бы, вероятно, сказал, что может быть лучше сделать Replace для строки. Хотя, если честно, если вы часто сталкиваетесь с кодом, похожим на этот, было бы так же быстро настроить служебную функцию для клонирования коллекции, взяв массив значений для ее фильтрации.

Таким образом, вам никогда больше не придется беспокоиться о таких проблемах:)

2 голосов
/ 09 сентября 2008
Response.Redirect(String.Format("nextpage.aspx?{0}", Request.QueryString.ToString().Replace("foo", "mangledfoo")));

Я быстро взломаю, мало тебя спасает. Но foo не будет присутствовать для кода, ожидающего его в nextpge.aspx:)

0 голосов
/ 29 апреля 2013

Вот решение, которое использует LINQ против Request.QueryString, которое позволяет при необходимости выполнять сложную фильтрацию параметров qs.

В приведенном ниже примере показано, как я отфильтровываю параметр uid, чтобы создать относительный URL, готовый для перенаправления.

До: http://www.domain.com/home.aspx?color=red&uid=1&name=bob

После: ~/home.aspx?color=red&name=bob

Удалить параметр QS из URL

var rq = this.Request.QueryString;
var qs = string.Join("&", rq.Cast<string>().Where(k => k != "uid").Select(k => string.Format("{0}={1}", k, rq[k])).ToArray());
var url = string.Concat("~", Request.RawUrl.Split('?')[0], "?", qs);
0 голосов
/ 02 мая 2012

Я нашел, что это было более элегантное решение

var qs = HttpUtility.ParseQueryString(Request.QueryString.ToString());
qs.Remove("item");
Console.WriteLine(qs.ToString());
0 голосов
/ 19 января 2012

Request.Url.GetLeftPart(UriPartial.Path) должен сделать это

0 голосов
/ 09 сентября 2008

Страница поиска добавляет "& term =" к строке запроса для выделения, поэтому это все испортило.

Только другой вариант - заменить регулярное выражение. Если вы точно знаете , что & термины находятся в середине коллекции, то где-нибудь оставляете конечный символ & в регулярном выражении, если вы точно знаете, он находится в конце, тогда отбросьте конечный символ & изменить строку замены "&" на String.Empty

Response.Redirect(String.Format("nextpage.aspx?{0}", Regex.Replace(Request.QueryString.ToString(), "&terms=.*&", "&"));
0 голосов
/ 09 сентября 2008

Можно ли клонировать коллекцию, а затем перенаправить на страницу с клонированной (и измененной) коллекцией?

Я знаю, что это не намного лучше, чем итерация ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...