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?

43
demandé sur user1620696 2017-01-10 23:02:18

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)
{...}
41
répondu Mike_G 2018-02-06 22:32:32

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.

40
répondu Darin Dimitrov 2017-01-10 20:09:24

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")
    {
    }
}
7
répondu Pavel 2018-01-14 16:24:54

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

  1. 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.)

  2. Route values: l'ensemble des valeurs de route fourni par Routing

  3. 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)
{ ... }
7
répondu spottedmahn 2018-05-22 13:22:31

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.

4
répondu steamrolla 2017-01-11 14:27:28