Comment puis-je supprimer élément de querystring dans asp.net utiliser c#?

je veux supprimer "Langue" querystring de mon url. Comment puis-je faire cela ? (en utilisant Asp.net 3.5, c#)

Default.aspx?Agent=10&Language=2

je veux supprimer" Language=2", mais le langage serait le premier,le milieu ou le dernier. donc je vais avoir ce

Default.aspx?Agent=20
52
demandé sur mbillard 2009-02-09 22:35:38

14 réponses

j'ai répondu à une la même question il y a un moment. Fondamentalement , la meilleure façon serait d'utiliser la classe HttpValueCollection , que la propriété QueryString est en fait, malheureusement elle est interne dans le cadre .NET. Vous pouvez utiliser le réflecteur pour le saisir (et le placer dans votre classe Utils). De cette façon, vous pourriez manipuler la chaîne de requête comme un NameValueCollection, mais avec tous les problèmes d'encodage/décodage url pris soin pour vous.

HttpValueCollection étend NameValueCollection , et a un constructeur qui prend une chaîne de requête encodée (ampersands et points d'interrogation inclus), et il remplace une méthode ToString() pour reconstruire plus tard la chaîne de requête à partir de la collection sous-jacente.

10
répondu Igal Tabachnik 2017-05-23 12:18:15

si c'est la HttpRequest.QueryString alors vous pouvez copier la collection dans une collection writable et avoir votre chemin avec elle.

NameValueCollection filtered = new NameValueCollection(request.QueryString);
filtered.Remove("Language");
113
répondu xcud 2009-02-09 19:51:36

voici un moyen simple. Réflecteur n'est pas nécessaire.

    public static string GetQueryStringWithOutParameter(string parameter)
    {
        var nameValueCollection = System.Web.HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
        nameValueCollection.Remove(parameter);
        string url = HttpContext.Current.Request.Path + "?" + nameValueCollection;

        return url;
    }

ici QueryString.ToString() est nécessaire parce que Request.QueryString collection est en lecture seule.

44
répondu Paulius Zaliaduonis 2014-12-30 20:30:27

enfin,

hmemcpy réponse était totalement pour moi et merci à d'autres amis qui ont répondu.

j'attrape la collecte Httpvaluec réflecteur et j'écris le code suivant

        var hebe = new HttpValueCollection();
        hebe.Add(HttpUtility.ParseQueryString(Request.Url.Query));

        if (!string.IsNullOrEmpty(hebe["Language"]))
            hebe.Remove("Language");

        Response.Redirect(Request.Url.AbsolutePath + "?" + hebe );
36
répondu Barbaros Alp 2009-02-09 21:35:24

Ma préférence personnelle ici est de réécrire la requête ou de travailler avec un namevaluecollection à un point inférieur, mais il ya des moments où la logique de l'entreprise rend ni l'un ni l'autre de ces très utile et parfois la réflexion est vraiment ce dont vous avez besoin. Dans ces circonstances, vous pouvez simplement désactiver le drapeau en lecture seule pour un moment comme cela:

// reflect to readonly property
PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

// make collection editable
isreadonly.SetValue(this.Request.QueryString, false, null);

// remove
this.Request.QueryString.Remove("foo");

// modify
this.Request.QueryString.Set("bar", "123");

// make collection readonly again
isreadonly.SetValue(this.Request.QueryString, true, null);
26
répondu annakata 2009-10-08 08:45:16

essayez ceci ...

PropertyInfo isreadonly   =typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);    

isreadonly.SetValue(this.Request.QueryString, false, null);
this.Request.QueryString.Remove("foo");
3
répondu Vishal Nayan 2013-06-11 17:31:36

vous n'indiquez pas clairement si vous essayez de modifier le Querystring en place dans l'objet Request. Puisque cette propriété est en lecture seule, je suppose que vous voulez juste jouer avec la corde.

... Dans ce cas, c'est limite banal.

  • saisir la chaîne de requête large de la Demande
  • .split() sur " & '
  • remettre ensemble dans une nouvelle chaîne, tout en reniflant et jeter tout ce qui commence par "langue
1
répondu Jason Kester 2009-02-09 19:44:57

Obtenir la collection querystring, analyser dans un ( name=value pair ) de la chaîne, à l'exclusion de celui que vous souhaitez SUPPRIMER, et le nom qu'il newQueryString

puis appelez Response.Redirect(known_path?newqueryString) ;

1
répondu Pita.O 2011-10-28 08:44:59
  1. rassemblez votre chaîne de requête en utilisant HttpContext.Request.QueryString . Il est par défaut de type NameValueCollection .
  2. lancez-le comme une chaîne et utilisez System.Web.HttpUtility.ParseQueryString() pour analyser la chaîne de requête (qui renvoie une NameValueCollection à nouveau).
  3. vous pouvez alors utiliser la fonction Remove() pour supprimer le paramètre spécifique (en utilisant la touche de référence pour supprimer ce paramètre).
  4. Utiliser cas les paramètres de requête retour à une chaîne et utiliser string.Join() pour formater la chaîne de requête en quelque chose de lisible par votre URL comme paramètres de requête valides.

Voir ci-dessous pour un exemple de travail, où param_to_remove est le paramètre que vous voulez supprimer.

disons que vos paramètres de requête sont param1=1&param_to_remove=stuff&param2=2 . Exécutez les lignes suivantes:

var queryParams = System.Web.HttpUtility.ParseQueryString(HttpContext.Request.QueryString.ToString());
queryParams.Remove("param_to_remove");
string queryString = string.Join("&", queryParams.Cast<string>().Select(e => e + "=" + queryParams[e]));

maintenant votre chaîne de requête devrait être param1=1&param2=2 .

1
répondu Blairg23 2016-02-29 23:33:07

vous allez probablement vouloir utiliser une Expression régulière pour trouver le paramètre que vous voulez supprimer du querystring, puis le supprimer et rediriger le navigateur vers le même fichier avec votre nouveau querystring.

0
répondu RKitson 2009-02-09 19:42:38

Oui, il n'y a pas de classe intégrée dans .NET pour éditer les chaînes de requête. Vous devrez utiliser Regex ou une autre méthode pour modifier la chaîne elle-même.

0
répondu David Morton 2009-02-09 19:42:48

si vous avez déjà la chaîne de requête comme une chaîne de caractères, vous pouvez aussi utiliser la manipulation de chaîne simple:

int pos = queryString.ToLower().IndexOf("parameter=");
if (pos >= 0)
{
    int pos_end = queryString.IndexOf("&", pos);
    if (pos_end >= 0)   // there are additional parameters after this one
        queryString = queryString.Substring(0, pos) + queryString.Substring(pos_end + 1);
    else
        if (pos == 0) // this one is the only parameter
            queryString = "";
        else        // this one is the last parameter
            queryString=queryString.Substring(0, pos - 1);
}
0
répondu Pedro Geada 2012-11-27 15:59:46
string queryString = "Default.aspx?Agent=10&Language=2"; //Request.QueryString.ToString();
string parameterToRemove="Language";   //parameter which we want to remove
string regex=string.Format("(&{0}=[^&\s]+|{0}=[^&\s]+&?)",parameterToRemove);
string finalQS = Regex.Replace(queryString, regex, "");

https://regexr.com/3i9vj

0
répondu yajiv 2017-12-20 13:05:16

Eh bien j'ai une solution simple , mais il y a un petit JavaScript impliqué.

en supposant que la chaîne de requête est "ok=1"

    string url = Request.Url.AbsoluteUri.Replace("&ok=1", "");
   url = Request.Url.AbsoluteUri.Replace("?ok=1", "");
  Response.Write("<script>window.location = '"+url+"';</script>");
-1
répondu Segev Dagan 2015-02-03 09:26:56