Comment lire les valeurs de querystring avec ASP.NET noyau?
je construis une API RESTful en utilisant ASP.NET MVC Core et moi voulons utiliser les paramètres querystring 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 le questionnaire pour filtrer et sélectionner les résultats à retourner.
j'ai déjà découvert que dans le contrôleur Get
accès HttpContext.Request.Query
retourne un IQueryCollection
.
Le problème est que je ne sais pas comment il est utilisé pour récupérer les valeurs. En vérité, j'ai pensé 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"]
ne retourne pas une chaîne, mais un StringValues
.
en tout cas, comment utiliser le IQueryCollection
lire réellement les valeurs de querystring?
5 réponses
Vous pouvez utiliser [FromQuery]
pour lier un modèle particulier pour la requête:
https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
par exemple
[HttpGet()]
public IActionResult Get([FromQuery(Name = "page")] string page)
{...}
Vous pouvez utiliser la méthode ToString IQueryCollection
qui renvoie la valeur désirée si un seul page
paramètre est spécifié:
string page = HttpContext.Request.Query["page"].ToString();
si il y a plusieurs valeurs comme ?page=1&page=2
alors le résultat de L'appel ToString sera 1,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 à la HttpContext.Request.Query
objet.
Voici l'exemple de code que j'ai utilisé (avec .net de base):
@{
Microsoft.Extensions.Primitives.StringValues queryVal;
if (Context.Request.Query.TryGetValue("yourKey", out queryVal) &&
queryVal.FirstOrDefault() == "yourValue")
{
}
}
ASP.NET le noyau se liera automatiquement form values
, route values
et query strings
par le nom. Cela signifie que vous pouvez simplement faire ceci:
[HttpGet()]
public IActionResult Get(int page)
{ ... }
MVC va essayer de lier les données de la requête aux paramètres de l'action par leur nom ... vous trouverez ci-dessous une liste des sources de données dans l'ordre dans lequel la liaison des modèles regarde à travers elles
Form values
: ce sont des valeurs de forme qui vont dans la requête HTTP en utilisant la méthode POST. (y compris jQuery POST demande.)
Route values
: l'ensemble des valeurs de route fourni par Routing
Query strings
: la partie "query string" de L'URI.
Source:Comment le modèle de la liaison fonctionne
pour votre information, vous pouvez également combiner les approches automatique et explicite:
[HttpGet()]
public IActionResult Get(int page
, [FromQuery(Name = "page-size")] int pageSize)
{ ... }
IQueryCollection
a un TryGetValue()
qui retourne une valeur avec la clé donnée. Donc, si vous aviez un paramètre de requête appelé someInt
, vous pouvez l'utiliser comme ceci:
var queryString = httpContext.Request.Query;
StringValues someInt;
queryString.TryGetValue("someInt", out someInt);
var daRealInt = int.Parse(someInt);
notez que sauf si vous avez plusieurs paramètres du même nom, le StringValues
type n'est pas un problème.