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

Je veux supprimer “Language” queryssortingng de mon URL. Comment puis-je faire ceci ? (en utilisant Asp.net 3.5, c #)

Default.aspx?Agent=10&Language=2 

Je veux supprimer “Language = 2”, mais la langue serait le premier, le milieu ou le dernier. donc je vais avoir ceci

 Default.aspx?Agent=20 

J’ai déjà répondu à une question similaire . Fondamentalement, le meilleur moyen serait d’utiliser la classe HttpValueCollection , ce que la propriété QuerySsortingng est réellement, malheureusement, elle est interne au framework .NET. Vous pouvez utiliser Reflector pour le saisir (et le placer dans votre classe Utils). De cette façon, vous pouvez manipuler la chaîne de requête comme un NameValueCollection, mais avec tous les problèmes d’encodage / décodage d’url pris en charge pour vous.

HttpValueCollection étend NameValueCollection et possède un constructeur qui prend une chaîne de requête codée (esperluettes et points d’interrogation inclus) et remplace une méthode ToSsortingng() pour reconstruire ultérieurement la chaîne de requête à partir de la collection sous-jacente.

Si c’est le HttpRequest.QuerySsortingng, vous pouvez copier la collection dans une collection accessible en écriture et suivre votre chemin.

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

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

  public static ssortingng GetQuerySsortingngWithOutParameter(ssortingng parameter) { var nameValueCollection = System.Web.HttpUtility.ParseQuerySsortingng(HttpContext.Current.Request.QuerySsortingng.ToSsortingng()); nameValueCollection.Remove(parameter); ssortingng url = HttpContext.Current.Request.Path + "?" + nameValueCollection; return url; } 

Ici, QuerySsortingng.ToSsortingng() est requirejs car la collection Request.QuerySsortingng est en lecture seule.

Finalement,

La réponse de hmemcpy était totalement pour moi et merci aux autres amis qui ont répondu.

Je prends le HttpValueCollection en utilisant Reflector et j’ai écrit le code suivant

  var hebe = new HttpValueCollection(); hebe.Add(HttpUtility.ParseQuerySsortingng(Request.Url.Query)); if (!ssortingng.IsNullOrEmpty(hebe["Language"])) hebe.Remove("Language"); Response.Redirect(Request.Url.AbsolutePath + "?" + hebe ); 

Ma préférence personnelle ici est de réécrire la requête ou d’utiliser une collection de noms à un niveau inférieur, mais il arrive que la logique métier ne soit d’aucune aide et que la reflection soit vraiment ce dont vous avez besoin. Dans ces circonstances, vous pouvez simplement désactiver le drapeau en lecture seule pendant un moment 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.QuerySsortingng, false, null); // remove this.Request.QuerySsortingng.Remove("foo"); // modify this.Request.QuerySsortingng.Set("bar", "123"); // make collection readonly again isreadonly.SetValue(this.Request.QuerySsortingng, true, null); 

Essaye ça …

 PropertyInfo isreadonly =typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); isreadonly.SetValue(this.Request.QuerySsortingng, false, null); this.Request.QuerySsortingng.Remove("foo"); 

Vous ne précisez pas si vous essayez de modifier le Queryssortingng en place dans l’object Request. Comme cette propriété est en lecture seule, je suppose que nous supposerons que vous voulez simplement jouer avec la chaîne.

… Dans ce cas, c’est borderline sortingvial.

  • saisir la requête de la requête
  • .split () il sur ‘&’
  • rassemblez-le en une nouvelle chaîne, tout en recherchant et en jetant tout ce qui commence par “language”

Obtenez la collection de chaîne de requête, parsingz-la en une chaîne ( name=value pair ), à l’exclusion de celle que vous souhaitez supprimer, et nommez-la newQuerySsortingng

Appelez ensuite Response.Redirect(known_path?newquerySsortingng) ;

  1. Rassemblez votre chaîne de requête à l’aide de HttpContext.Request.QuerySsortingng . Par défaut, il s’agit d’un type NameValueCollection .
  2. Convertissez-le en chaîne et utilisez System.Web.HttpUtility.ParseQuerySsortingng() pour parsingr la chaîne de requête (qui renvoie à nouveau NameValueCollection ).
  3. Vous pouvez ensuite utiliser la fonction Remove() pour supprimer le paramètre spécifique (en utilisant la clé pour référencer ce paramètre à supprimer).
  4. Utilisez la casse les parameters de requête de nouveau à une chaîne et utilisez ssortingng.Join() pour formater la chaîne de requête comme quelque chose de lisible par votre URL en tant que parameters de requête valides.

Voir ci-dessous un exemple de travail, où param_to_remove est le paramètre à supprimer.

Disons que vos parameters de requête sont param1=1&param_to_remove=stuff&param2=2 . Exécutez les lignes suivantes:

 var queryParams = System.Web.HttpUtility.ParseQuerySsortingng(HttpContext.Request.QuerySsortingng.ToSsortingng()); queryParams.Remove("param_to_remove"); ssortingng querySsortingng = ssortingng.Join("&", queryParams.Cast().Select(e => e + "=" + queryParams[e])); 

Maintenant, votre chaîne de requête doit être param1=1&param2=2 .

Vous allez probablement vouloir utiliser une expression régulière pour trouver le paramètre que vous souhaitez supprimer de la chaîne de requête, puis le supprimer et redirect le navigateur vers le même fichier avec votre nouvelle chaîne de requête.

Oui, aucune classe n’est intégrée à .NET pour modifier les chaînes de requête. Vous devrez soit utiliser Regex ou une autre méthode de modification de la chaîne elle-même.

Si vous avez déjà la chaîne de requête sous forme de chaîne, vous pouvez également utiliser la manipulation de chaîne simple:

 int pos = querySsortingng.ToLower().IndexOf("parameter="); if (pos >= 0) { int pos_end = querySsortingng.IndexOf("&", pos); if (pos_end >= 0) // there are additional parameters after this one querySsortingng = querySsortingng.Subssortingng(0, pos) + querySsortingng.Subssortingng(pos_end + 1); else if (pos == 0) // this one is the only parameter querySsortingng = ""; else // this one is the last parameter querySsortingng=querySsortingng.Subssortingng(0, pos - 1); } 
 ssortingng querySsortingng = "Default.aspx?Agent=10&Language=2"; //Request.QuerySsortingng.ToSsortingng(); ssortingng parameterToRemove="Language"; //parameter which we want to remove ssortingng regex=ssortingng.Format("(&{0}=[^&\s]+|{0}=[^&\s]+&?)",parameterToRemove); ssortingng finalQS = Regex.Replace(querySsortingng, regex, ""); 

https://regexr.com/3i9vj

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”

  ssortingng url = Request.Url.AbsoluteUri.Replace("&ok=1", ""); url = Request.Url.AbsoluteUri.Replace("?ok=1", ""); Response.Write("");