Как удалить элементы из строки запроса для перенаправления?

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

Request.QueryString.Remove("foo")

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

10 ответов


вам нужно будет восстановить url-адрес, а затем перенаправить. Что-то вроде этого:--2-->

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);

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


вы можете избежать прикосновения к исходной строке запроса, работая над ее копией. Затем вы можете перенаправить страницу на 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);

Response.Redirect(String.Format("nextpage.aspx?{0}", Request.QueryString.ToString().Replace("foo", "mangledfoo")));

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


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

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

если целевая страница не читает его, почему вам нужно удалить это из строки запроса?

его просто проигнорируют?

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

UPDATE-следующий ответ от OP

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

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

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


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); 

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

только другой вариант-регулярное выражение replace. Если ты ... --8-->знаю это & термины находится в середине коллекции где-то оставить трейлинг & в регулярном выражении, если вы знаю это в конце, затем отбросьте трейлинг & и измените строку замены " & "на строку.Пусто

Response.Redirect(String.Format("nextpage.aspx?{0}", Regex.Replace(Request.QueryString.ToString(), "&terms=.*&", "&"));

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


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

var qs = HttpUtility.ParseQueryString(Request.QueryString.ToString());
qs.Remove("item");
Console.WriteLine(qs.ToString());

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

пример ниже показывает меня отфильтровывая uid param для создания относительного url-адреса, готового к перенаправлению.

перед: http://www.domain.com/home.aspx?color=red&uid=1&name=bob

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

удалить QS param из 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);

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

Я знаю, что это не намного лучше, чем перебор...