Je construis une API RESTful à l'aide d'ASP.NET Core MVC et je souhaite utiliser des paramètres de chaîne de requête pour spécifier le filtrage et la pagination sur une ressource qui renvoie une collection.
Dans ce cas, je dois lire les valeurs passées dans la chaîne de requête pour filtrer et sélectionner les résultats à renvoyer.
J'ai déjà découvert qu'à l'intérieur de l' Get
action du contrôleur , l'accès en HttpContext.Request.Query
renvoie un IQueryCollection
.
Le problème est que je ne sais pas comment il est utilisé pour récupérer les valeurs. En vérité, je pensais que la façon de faire était d'utiliser, par exemple
string page = HttpContext.Request.Query["page"]
Le problème est que HttpContext.Request.Query["page"]
cela ne renvoie pas de chaîne, mais un fichier StringValues
.
Quoi qu'il en soit, comment utiliser IQueryCollection
pour lire réellement les valeurs de la chaîne de requête?
la source
Réponses:
Vous pouvez utiliser
[FromQuery]
pour lier un modèle particulier à la chaîne de requête:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
par exemple
la source
[FromQuery]
attribut peut également être omis car la liaison .net vérifiera toutes les entrées de formulaire et tous les paramètres de chaîne de requête d'url par défaut, sauf que vous avez des raisons de limiter sa source.Vous pouvez utiliser la méthode ToString sur
IQueryCollection
laquelle retournera la valeur souhaitée si un seulpage
paramètre est spécifié:s'il y a plusieurs valeurs comme
?page=1&page=2
alors le résultat de l'appel ToString sera1,2
Mais comme @ mike-g l'a suggéré dans sa réponse, vous feriez mieux d'utiliser la liaison de modèle et de ne pas accéder directement à l'
HttpContext.Request.Query
objet.la source
ASP.NET de base se liera automatiquement
form values
,route values
etquery strings
par son nom. Cela signifie que vous pouvez simplement faire ceci:Source: Fonctionnement de la liaison de modèle
Pour info, vous pouvez également combiner les approches automatiques et explicites:
la source
Vous pouvez simplement créer un objet comme celui-ci:
Et puis dans le contrôleur, faites quelque chose comme ça:
Mieux encore, vous pouvez créer un modèle d'API à partir de:
à:
la source
Voici un exemple de code que j'ai utilisé (avec une vue .NET Core):
la source
StringValues
est un tableau de chaînes . Vous pouvez obtenir la valeur de votre chaîne en fournissant un index, par exempleHttpContext.Request.Query["page"][0]
.la source
IQueryCollection
a unTryGetValue()
dessus qui renvoie une valeur avec la clé donnée. Donc, si vous avez appelé un paramètre de requêtesomeInt
, vous pouvez l'utiliser comme ceci:Notez qu'à moins que vous n'ayez plusieurs paramètres du même nom, le
StringValues
type n'est pas un problème.la source
dans .net core si vous souhaitez accéder à la chaîne de requête dans notre vue, utilisez-le comme
si nous sommes dans un endroit où @Context n'est pas disponible, nous pouvons l'injecter comme
aussi pour les cookies
la source
J'ai une meilleure solution pour ce problème,
var searchparams = await Request.GetSearchParams();
J'ai créé une classe statique avec quelques méthodes d'extension
de cette façon, vous pouvez facilement accéder à tous vos paramètres de recherche. J'espère que cela aidera de nombreux développeurs :)
la source
Certains commentaires le mentionnent également, mais asp net core fait tout ce travail pour vous.
Si vous avez une chaîne de requête qui correspond au nom, elle sera disponible dans le contrôleur.
https: // myapi / some-endpoint / 123? someQueryString = YayThisWorks
Sorties:
123
YayThisWorks
la source