Как удалить элементы из строки запроса для перенаправления?
на моей базовой странице мне нужно удалить элемент из строки запроса и перенаправить. Я не могу использовать
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=.*&", "&"));
Я обнаружил, что это более элегантное решение
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);
можете ли вы клонировать коллекцию, а затем перенаправить на страницу с клонированной (и измененной) коллекцией?
Я знаю, что это не намного лучше, чем перебор...