web-dev-qa-db-fra.com

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 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
52
Barbaros Alp

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.

10
Igal Tabachnik

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");
113
xcud

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.

44
Paulius Zaliaduonis

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 );
36
Barbaros Alp

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);
26
annakata

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");
3
Vishal Nayan
  1. Rassemblez votre chaîne de requête en utilisant HttpContext.Request.QueryString. Par défaut, il s'agit d'un type NameValueCollection.
  2. Convertissez-le en chaîne et utilisez System.Web.HttpUtility.ParseQueryString() pour analyser 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 (à l'aide de la touche pour référencer ce paramètre à supprimer).
  4. Utilisez les paramètres de requête dans une chaîne et utilisez 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&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]));

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

1
Blairg23

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.

  • récupérer la chaîne de requête de la demande
  • .split () il sur '&'
  • remettez-le ensemble dans une nouvelle chaîne, tout en recherchant et en lançant tout ce qui commence par «langage»
1
Jason Kester

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

1
Pita.O

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();
0
Kurkula

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>");
0
Segev Dagan

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);
}
0
Pedro Geada

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.

0
RKitson

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. 

0
David Morton
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
yajiv