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?
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)
{...}
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
.
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.
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).
Route values
: ensemble des valeurs d'itinéraire fournies par le routage
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)
{ ... }
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")
{
}
}
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.
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..
}
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]
.
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"]