188 votes

Comment analyser une chaîne de requête dans NameValueCollection dans .NET

Je voudrais analyser une chaîne comme « p1 = 6 & p2 = 7 & p3 = 8 » dans une NameValueCollection.

Quelle est la façon la plus élégante de le faire quand vous n’avez pas accès à l’objet Page.Request ?

363voto

Guy Starbuck Points 14241

Il existe un utilitaire intégré de .NET pour cela : HttpUtility.ParseQueryString

45voto

Scott Dorman Points 25000

HttpUtility.ParseQueryString fonctionnera tant que vous êtes dans une application web ou ne me dérange pas y compris une dépendance sur System.Web. Une autre façon de faire est :

31voto

James Skimming Points 683

Beaucoup de réponses sont fournissant des exemples, parce que de la a accepté de répondre à la dépendance sur le Système.Web. À partir de la Microsoft.AspNet.WebApi.Client de package NuGet il y a un UriExtensions.ParseQueryString, méthode qui peut également être utilisé:

var uri = new Uri("http://stackoverflow.com/a/22167748?p1=6&p2=7&p3=8");
NameValueCollection query = uri.ParseQueryString();

Donc, si vous voulez éviter le Système.Web de dépendance et ne veulent pas rouler, c'est une bonne option.

21voto

densom Points 370

J’ai voulu supprimer la dépendance vis-à-vis de System.Web afin que je puisse analyser la chaîne de requête d’un déploiement ClickOnce, tout en ayant des prérequis limités à la « sous-ensemble de Framework Client seulement ».

J’ai aimé la réponse de rp. J’ai ajouté une logique supplémentaire.

7voto

Josh Brown Points 501

J'ai besoin d'une fonction qui est un peu plus polyvalent que ce qui a été déjà fournis lorsque vous travaillez avec des OLSC requêtes.

  • Les valeurs peuvent contenir plusieurs signes égal
  • Décoder les caractères codés à la fois de nom et de valeur
  • Capable de courir sur le Cadre du Client
  • Capable de fonctionner sur Cadre Mobile.

Voici ma solution:

Public Shared Function ParseQueryString(ByVal uri As Uri) As System.Collections.Specialized.NameValueCollection
    Dim result = New System.Collections.Specialized.NameValueCollection(4)
    Dim query = uri.Query
    If Not String.IsNullOrEmpty(query) Then
        Dim pairs = query.Substring(1).Split("&"c)
        For Each pair In pairs
            Dim parts = pair.Split({"="c}, 2)

            Dim name = System.Uri.UnescapeDataString(parts(0))
            Dim value = If(parts.Length = 1, String.Empty,
                System.Uri.UnescapeDataString(parts(1)))

            result.Add(name, value)
        Next
    End If
    Return result
End Function

Il est peut-être pas une mauvaise idée de virer <Extension()> sur que trop d'ajouter la possibilité d'Uri.

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