Pregunta

En mi página base necesito eliminar un elemento de la cadena de consulta y redirigir.no puedo usar

Request.QueryString.Remove("foo")

porque la colección es de solo lectura.¿Hay alguna forma de obtener la cadena de consulta (excepto ese elemento) sin recorrer la colección y reconstruirla?

¿Fue útil?

Solución

Tendrías que reconstruir la URL y luego redirigir.Algo como esto:

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 todos modos, no probé eso ni nada, pero debería funcionar (o al menos llevarte en la dirección correcta)

Otros consejos

Puede evitar tocar la cadena de consulta original trabajando en una copia de la misma.Luego puede redirigir la página a una URL que contiene su cadena de consulta modificada de esta manera:

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

Actualizar:

Resulta que podemos simplificar el código así:

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

Hago un truco rápido, te ahorra poco.Pero foo no estará presente en el código que lo espera en nextpge.aspx :)

Interesante pregunta.No veo ninguna alternativa real viable a copiar manualmente la colección desde Copiar a solo le permitirá obtener los valores (y no las claves).

Creo El truco de HollyStyles funcionaría (aunque me pondría nervioso poner un Reemplazar en una QueryString - obv.depende del caso de uso), pero hay una cosa que me molesta...

Si la página de destino no la lee, ¿por qué es necesario eliminarla de QueryString?

¿Será simplemente ignorado?

De lo contrario, creo que sólo tendrías que hacer de tripas corazón y crear un método de utilidad para modificar la colección por ti.

ACTUALIZACIÓN: tras la respuesta del OP

¡Ahhh!Ahora veo que sí, he tenido problemas similares con SiteMap al realizar una comparación completa de la cadena.

Desde que se cambió el otro código fuente (es decir,la búsqueda) está fuera de discusión, probablemente diría que sería mejor hacer un Reemplazar en la cadena.Aunque, para ser justos, si a menudo encuentra un código similar a este, sería igual de rápido configurar una función de utilidad para clonar la colección, tomando una serie de valores para filtrarla.

De esta manera nunca más tendrás que preocuparte por estos problemas :)

HttpUtility.ParseQueryString(Request.Url.Query) el regreso esQueryStringValueCollection.Es heredado 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); 

La página de búsqueda se agrega "& Términos =" a la cadena de consulta para resaltar, por lo que lo arruina.

La única otra opción es reemplazar la expresión regular.Si usted estar seguro que &terms está en el medio de la colección en algún lugar, deje el & final en la expresión regular, si estar seguro está al final, luego suelte el & final y cambie la cadena de reemplazo "&" a String.Empty

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

Request.Url.GetLeftPart(UriPartial.Path) debería hacer esto

Descubrí que esta era una solución más elegante.

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

Aquí hay una solución que usa LINQ contra el Request.QueryString lo que permite un filtrado complejo de parámetros qs si es necesario.

El siguiente ejemplo me muestra filtrando el uid parámetro para crear una URL relativa lista para la redirección.

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

Después: ~/home.aspx?color=red&name=bob

Eliminar el parámetro QS de la 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);

¿Puedes clonar la colección y luego redirigir a la página con la colección clonada (y modificada)?

Sé que no es mucho mejor que iterar...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top