Comment supprimer des éléments de la chaîne de requête pour la redirection ?

StackOverflow https://stackoverflow.com/questions/51964

  •  09-06-2019
  •  | 
  •  

Question

Dans ma page de base, je dois supprimer un élément de la chaîne de requête et le rediriger.je ne peux pas utiliser

Request.QueryString.Remove("foo")

car la collection est en lecture seule.Existe-t-il un moyen d'obtenir la chaîne de requête (à l'exception de cet élément) sans parcourir la collection et la reconstruire ?

Était-ce utile?

La solution

Vous devrez reconstruire l'URL, puis rediriger.Quelque chose comme ça:

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

Quoi qu'il en soit, je n'ai pas testé ça ou quoi que ce soit, mais ça devrait fonctionner (ou au moins te mettre dans la bonne direction)

Autres conseils

Vous pouvez éviter de toucher à la chaîne de requête d'origine en travaillant plutôt sur une copie de celle-ci.Vous pouvez ensuite rediriger la page vers une URL contenant votre chaîne de requête modifiée comme ceci :

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

Mise à jour:

Il s'avère que nous pouvons simplifier le code comme ceci :

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

Je pirate rapidement, cela vous fait gagner peu.Mais foo ne sera pas présent pour le code qui l'attend dans nextpge.aspx :)

Question interessante.Je ne vois pas d'alternative réellement viable à la copie manuelle de la collection puisque Copier vous permettra uniquement d'obtenir les valeurs (et non les clés).

Je pense Le hack de HollyStyles fonctionnerait (même si je serais nerveux à l'idée de mettre un Replace dans un QueryString - obv.cela dépend du cas d'utilisation), mais il y a une chose qui me dérange.

Si la page cible ne la lit pas, pourquoi devez-vous la supprimer de QueryString ?

Cela sera-t-il simplement ignoré ?

À défaut, je pense qu'il vous suffirait de serrer les dents et de créer une méthode utile pour modifier la collection à votre place.

MISE À JOUR - Suite à la réponse d'OP

Ahhhh !Je vois maintenant, oui, j'ai eu des problèmes similaires avec SiteMap effectuant une comparaison complète de la chaîne.

Depuis le changement de l'autre code source (c.-à-d.la recherche) est hors de question, je dirais probablement qu'il serait peut-être préférable de faire un remplacement sur la chaîne.Bien que pour être honnête, si vous rencontrez souvent du code similaire à celui-ci, il serait tout aussi rapide de configurer une fonction utilitaire pour cloner la collection, en prenant un tableau de valeurs à filtrer.

De cette façon, vous n'aurez plus jamais à vous soucier de tels problèmes :)

HttpUtility.ParseQueryString(Request.Url.Query) le retour estQueryStringValueCollection.C'est un héritage 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 page de recherche ajoute "& Termes =" à la chaîne de requête pour mettre en surbrillance, donc elle la gâche.

La seule autre option est un remplacement d'expression régulière.Si tu je sais avec certitude que &terms est au milieu de la collection quelque part, laissez le & final dans l'expression régulière, si vous je sais avec certitude c'est à la fin, puis supprimez le & final et remplacez la chaîne de remplacement "&" par String.Empty

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

Request.Url.GetLeftPart(UriPartial.Path) je devrais faire ça

J'ai trouvé que c'était une solution plus élégante

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

Voici une solution qui utilise LINQ contre le Request.QueryString ce qui permet un filtrage complexe des paramètres qs si nécessaire.

L'exemple ci-dessous me montre filtrer le uid param pour créer une URL relative prête pour la redirection.

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

Après: ~/home.aspx?color=red&name=bob

Supprimer le paramètre QS de l'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);

Pouvez-vous cloner la collection, puis rediriger vers la page contenant la collection clonée (et modifiée) ?

Je sais que ce n'est pas beaucoup mieux que d'itérer...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top