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?
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
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
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
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)
J'ai trouvé deux problèmes dans votre question:
arr
tandis que l'action de votre contrôleur a values
.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.
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