Pergunta

Na minha página base, preciso remover um item da string de consulta e redirecionar.não posso usar

Request.QueryString.Remove("foo")

porque a coleção é somente leitura.Existe alguma maneira de obter a string de consulta (exceto aquele item) sem iterar pela coleção e reconstruí-la?

Foi útil?

Solução

Você teria que reconstruir o URL e depois redirecionar.Algo assim:

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

De qualquer forma, eu não testei isso nem nada, mas deve funcionar (ou pelo menos levar você na direção certa)

Outras dicas

Você pode evitar tocar na string de consulta original trabalhando em uma cópia dela.Você pode então redirecionar a página para um URL que contém sua string de consulta modificada, assim:

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

Atualizar:

Acontece que podemos simplificar o código assim:

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

Eu hackeio rápido, você economiza pouco.Mas foo não estará presente para o código que o aguarda em nextpge.aspx :)

Pergunta interessante.Não vejo nenhuma alternativa viável para copiar manualmente a coleção, pois Copiar para permitirá apenas que você obtenha os valores (e não as chaves).

Eu penso Hack de HollyStyles funcionaria (embora eu ficasse nervoso em colocar um Replace em um QueryString - obv.depende do caso de uso), mas há uma coisa que está me incomodando.

Se a página de destino não a estiver lendo, por que você precisa removê-la do QueryString?

Será simplesmente ignorado?

Caso contrário, acho que você só precisa se arriscar e criar um método utilitário para alterar a coleção para você.

ATUALIZAÇÃO - Após resposta do OP

Ahhhh!Vejo agora, sim, tive problemas semelhantes com o SiteMap realizando uma comparação completa da string.

Desde a alteração do outro código-fonte (ou seja,a pesquisa) está fora de questão, eu provavelmente diria que talvez seja melhor fazer um Substituir na string.Embora, para ser justo, se você encontrar frequentemente código semelhante a este, seria igualmente rápido configurar uma função utilitária para clonar a coleção, pegando uma matriz de valores para filtrá-la.

Dessa forma, você nunca mais teria que se preocupar com esses problemas :)

HttpUtility.ParseQueryString(Request.Url.Query) retorno éQueryStringValueCollection.É herdado de 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); 

A página de pesquisa anexa "& termos =" à sequência de consulta para destaque, para que isso atrapalhe.

A única outra opção é uma substituição de regex.Se você saber com certeza que &terms está no meio da coleção em algum lugar, deixe o final & no regex, se você saber com certeza está no final, solte o & final e altere a string de substituição "&" para String.Empty

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

Request.Url.GetLeftPart(UriPartial.Path) deveria fazer isso

Achei que esta era uma solução mais elegante

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

Aqui está uma solução que usa LINQ contra o Request.QueryString que permite a filtragem complexa de parâmetros qs, se necessário.

O exemplo abaixo me mostra filtrando o uid param para criar um URL relativo pronto para redirecionamento.

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

Depois: ~/home.aspx?color=red&name=bob

Remover parâmetro QS do 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);

Você pode clonar a coleção e depois redirecionar para a página com a coleção clonada (e modificada)?

Eu sei que não é muito melhor do que iterar ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top