web-dev-qa-db-fra.com

Comment lire les valeurs de la chaîne de requête avec ASP.NET Core?

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 transmises 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'action Get du contrôleur, accéder à HttpContext.Request.Query renvoie une 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 le moyen à faire était d'utiliser, par exemple

string page = HttpContext.Request.Query["page"]

Le problème est que HttpContext.Request.Query["page"] ne renvoie pas de chaîne, mais une StringValues.

Quoi qu’il en soit, comment utiliser la IQueryCollection pour lire les valeurs de chaîne de requête?

59
user1620696

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.

[HttpGet()]
public IActionResult Get([FromQuery(Name = "page")] string page)
{...}
60
Mike_G

Vous pouvez utiliser la méthode ToString sur IQueryCollection qui renverra la valeur souhaitée si un seul paramètre page est spécifié:

string page = HttpContext.Request.Query["page"].ToString();

s'il existe plusieurs valeurs telles que ?page=1&page=2, le résultat de l'appel ToString sera 1,2

Mais comme l'a suggéré @ mike-g dans sa réponse, vous feriez mieux d'utiliser la liaison de modèle et de ne pas accéder directement à l'objet HttpContext.Request.Query.

51
Darin Dimitrov

ASP.NET Core liera automatiquement form values, route values et query strings par leur nom. Cela signifie que vous pouvez simplement faire ceci:

[HttpGet()]
public IActionResult Get(int page)
{ ... }

MVC essaiera de lier les données de requête aux paramètres d’action par nom.

  1. Form values: Ce sont des valeurs de formulaire qui vont dans la requête HTTP en utilisant la méthode POST. (y compris les demandes jQuery POST).

  2. Route values: ensemble des valeurs d'itinéraire fournies par le routage

  3. Query strings: partie de la chaîne de requête de l'URI.

Source: Comment fonctionne la liaison de modèle


Pour votre information, vous pouvez également combiner les approches automatiques et explicites:

[HttpGet()]
public IActionResult Get(int page
     , [FromQuery(Name = "page-size")] int pageSize)
{ ... }
10
spottedmahn

Voici un exemple de code que j'ai utilisé (avec une vue .NET Core):

@{
    Microsoft.Extensions.Primitives.StringValues queryVal;

    if (Context.Request.Query.TryGetValue("yourKey", out queryVal) &&
        queryVal.FirstOrDefault() == "yourValue")
    {
    }
}
10
Pavel

IQueryCollection a une TryGetValue() qui renvoie une valeur avec la clé donnée. Donc, si vous aviez un paramètre de requête appelé someInt, vous pourriez l'utiliser comme suit:

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 type StringValues n'est pas un problème.

5
steamrolla

Vous pouvez simplement créer un objet comme celui-ci:

public class SomeQuery
{
    public string SomeParameter { get; set; }
    public int? SomeParameter2 { get; set; }
}

Et puis dans le contrôleur, faites quelque chose comme ça:

[HttpGet]
public IActionResult FindSomething([FromQuery] SomeQuery query)
{
    // Your implementation goes here..
}
3
Mariusz

StringValues est un tableau de chaînes . Vous pouvez obtenir votre valeur de chaîne en fournissant un index, par exemple. HttpContext.Request.Query["page"][0].

3
Constantinos G.

si vous voulez accéder à la chaîne de requête, utilisez-le comme 

@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
@if (HttpContextAccessor.HttpContext.Request.Query.Keys.Contains("yourKey "))
{
      <text>do something </text>
}

aussi pour les cookies 

HttpContextAccessor.HttpContext.Request.Cookies["DeniedActions"]
0
M.Ali El-Sayed