54 votes

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

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

 Default.aspx?Agent=10&Language=2
 

Je veux supprimer "Langue = 2", mais la langue serait le premier, le moyen ou le dernier. donc j'aurai ceci

 Default.aspx?Agent=20
 

116voto

xcud Points 6878

S'il s'agit de HttpRequest.QueryString, vous pouvez copier la collection dans une collection accessible en écriture et vous en servir.

 NameValueCollection filtered = new NameValueCollection(request.QueryString);
filtered.Remove("Language");
 

46voto

Voici un moyen simple. Le réflecteur n'est pas nécessaire.

 var nameValueCollection = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
nameValueCollection.Remove(tenantPropertyName);
string url = HttpContext.Current.Request.Path + "?" + nameValueCollection;
 

Ici, QueryString.ToString() est requis car la collecte Request.QueryString est en lecture seule.

36voto

Barbaros Alp Points 3439

Finalement,

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

Je saisis la HttpValueCollection à l’aide de Reflector et ai écrit 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 );
 

26voto

annakata Points 42676

Ma préférence personnelle ici est de réécrire la requête ou de travailler avec une collection nommée à un niveau inférieur, mais il arrive parfois que la logique commerciale ne rend aucune de ces informations très utiles et que, parfois, la réflexion soit ce dont vous avez besoin. Dans ces circonstances, vous pouvez simplement désactiver le drapeau readonly un instant comme ceci:

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

10voto

Igal Tabachnik Points 15160

J'ai répondu à une question similaire il y a longtemps. Fondamentalement, le meilleur moyen serait d'utiliser la classe HttpValueCollection, laquelle le QueryString propriété est en fait, malheureusement, il est interne dans la .NET framework. Vous pouvez utiliser un Réflecteur pour l'attraper (et la placer dans votre classe Utils). De cette façon, vous pouvez manipuler la chaîne de requête comme une NameValueCollection, mais avec toutes les url de codage/décodage des problèmes pris en charge pour vous.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X