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
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.
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");
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.
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 );
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);
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");
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
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)
;
- rassemblez votre chaîne de requête en utilisant
HttpContext.Request.QueryString
. Il est par défaut de typeNameValueCollection
. - lancez-le comme une chaîne et utilisez
System.Web.HttpUtility.ParseQueryString()
pour analyser la chaîne de requête (qui renvoie uneNameValueCollection
à nouveau). - 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). - 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¶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]));
maintenant votre chaîne de requête devrait être param1=1¶m2=2
.
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.
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.
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);
}
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, "");
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>");