web-dev-qa-db-fra.com

Passer le tableau dans la chaîne de requête de route ASP.NET Core

Je veux faire this , mais je veux aussi pouvoir passer des tableaux dans la chaîne de requête. J'ai essayé des choses comme:

http://www.sitename.com/route?arr[]=this&arr[]=that
http://www.sitename.com/route?arr[]=this&that
http://www.sitename.com/route?arr[0]=this&arr[1]=that
http://www.sitename.com/route?arr0=this&arr1=that
http://www.sitename.com/route?arr=this&arr=that

Et mon itinéraire dans le code C # ressemble à ceci:

[Route("route")]
[HttpGet]
public void DoSomething(string[] values)
{
    // ...
}

Mais dans tous ces cas, les valeurs sont toujours nulles quand elles arrivent au code C #. De quoi ai-je besoin pour que ma chaîne de requête transmette un tableau de chaînes?

18
user3685285

Utilisez un nom de paramètre dans la chaîne de requête. Si vous avez une action:

public void DoSomething(string[] values)

Utilisez ensuite values dans la chaîne de requête pour passer un tableau à un serveur:

?values=this&values=that
15
Ilya Chumakov

La chaîne délimitée n'est pas la norme. Pensez également au client si vous supportez le swagger ou d'autres générateurs.

Pour ceux qui s'interrogent sur le bogue .net core 2.1 qui reçoit une liste vide, le travail est ici: https://github.com/aspnet/Mvc/issues/7712#issuecomment-39700342

Il a besoin d'un paramètre de nom sur FromQuery

[FromQuery(Name = "employeeNumbers")] List<string> employeeNumbers
15
Mohsen Tabareh

J'ai dû faire quelque chose de similaire à cela, mais au lieu de chaînes, j'ai utilisé une liste de long pour passer un identifiant pour une recherche. En utilisant une option de sélection multiple, les valeurs choisies sont envoyées à la méthode (via get) comme ceci:

[HttpGet("[action]")]
public IActionResult Search(List<long> idsSelected)
{
    ///do stuff here
}

J'utilise également Route("[controller]") avant la déclaration de classe. Fonctionne très bien, mais la liste des éléments est divisée en plusieurs paramètres dans l'URL, comme indiqué ci-dessous.

http://localhost:5000/Search/idsSelected=1&idsSelected=2
5
Pablo

J'ai trouvé une solution. Par exemple, si vous avez une requête comme celle-ci http://www.sitename.com/route?arr [] = this & arr [] = that . Vous devez définir en action le code suivant [FromQuery (Name = "arr []")]. Le nom du paramètre doit être placé entre crochets "arr []". En conséquence, nous pouvons voir:

public void DoSomething ([FromQuery (Name = "arr []")] string [] arr)

4
Alex

J'ai trouvé deux problèmes dans votre question:

  1. Votre requête a des paramètres nommés arr tandis que l'action de votre contrôleur a values.
  2. Je ne sais pas pourquoi, mais vous devez nommer votre paramètre ( comme répondu ici ) pour que Asp .NET ModelBinder puisse fonctionner comme prévu. Comme ça:
public void DoSomething([FromQuery(Name = "values")] string[] values)

Après cela, tout devrait fonctionner comme prévu.

4
Machado

Donné:

public ValuesController
{
    public IACtionResult Get([FromUri]string[] arr)
    {
        Return Ok(arr.Length);
    }
}

La demande suivante fonctionnera:

GET /api/values/?arr[0]=a&arr[1]=b&arr[2]=c
2
abatishchev