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 souhaite supprimer "Langue = 2", mais la langue serait la première, la deuxième ou la dernière. donc je vais avoir ça
Default.aspx?Agent=20
J'ai répondu à une question similaire il y a quelque temps. Fondamentalement, le meilleur moyen serait d'utiliser la classe HttpValueCollection
, qui est en réalité la propriété QueryString
. Malheureusement, elle est interne au framework .NET . Vous pouvez utiliser Reflector 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 tous les problèmes de codage/décodage d'URL pris en charge pour vous.
HttpValueCollection
étend NameValueCollection
et a un constructeur qui prend une chaîne de requête codée (esperluettes et points d'interrogation inclus) et substitue une méthode ToString()
pour reconstruire ultérieurement la chaîne de requête à partir de la collection sous-jacente.
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");
Voici un moyen simple. Le 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 requis car la collection Request.QueryString
est en lecture seule.
Finalement,
hmemcpy réponse était totalement pour moi et merci à d'autres amis qui ont répondu.
Je récupère la HttpValueCollection à l’aide de Reflector et é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 );
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);
Essaye ça ...
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");
HttpContext.Request.QueryString
. Par défaut, il s'agit d'un type NameValueCollection
.System.Web.HttpUtility.ParseQueryString()
pour analyser la chaîne de requête (qui renvoie à nouveau NameValueCollection
).Remove()
pour supprimer le paramètre spécifique (à l'aide de la touche pour référencer ce paramètre à supprimer).string.Join()
pour formater la chaîne de requête en quelque chose de lisible par votre URL en tant que paramètres de requête valides.Voir ci-dessous un exemple pratique, où param_to_remove
est le paramètre que vous souhaitez supprimer.
Disons que vos paramètres de requête sont param1=1¶m_to_remove=stuff¶m2=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]));
Votre chaîne de requête devrait maintenant être param1=1¶m2=2
.
Vous ne précisez pas si vous essayez de modifier la chaîne de chaînes de caractères en place dans l'objet Request. Étant donné que cette propriété est en lecture seule, nous supposerons que vous voulez simplement manipuler la chaîne.
... Dans ce cas, c'est banal.
Obtenez la collection de chaînes de chaînes de caractères, analysez-la dans une chaîne (name=value pair
), en excluant celle que vous souhaitez SUPPRIMER, et nommez-la newQueryString.
Ensuite, appelez Response.Redirect(known_path?newqueryString)
;
Analyser la chaîne de requête dans une collection NameValueCollection. Supprimer un élément. Et utilisez toString pour le reconvertir en chaîne de requête.
using System.Collections.Specialized;
NameValueCollection filteredQueryString = System.Web.HttpUtility.ParseQueryString(Request.QueryString.ToString());
filteredQueryString.Remove("appKey");
var queryString = '?'+ filteredQueryString.ToString();
eh bien, j'ai une solution simple, mais il y a un peu de javascript impliquer.
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>");
Si vous avez déjà la chaîne de requête sous forme de chaîne, vous pouvez également utiliser une simple manipulation de chaîne:
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);
}
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 rediriger 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 pour modifier la chaîne elle-même.
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, "");