J’ai un contrôleur ASP.net MVC appelé Designs
qui a une action avec la signature suivante:
public ActionResult Multiple(int[] ids)
Cependant, lorsque j’essaie de naviguer vers cette action en utilisant l’url:
http://localhost:54119/Designs/Multiple?ids=24041,24117
Le paramètre ids
est toujours nul. Est-il possible d’obtenir MVC pour convertir le paramètre de requête ?ids=
URL dans un tableau pour l’action? J’ai vu l’utilisation d’un filtre d’action, mais pour autant que je sache, cela ne fonctionnera que pour les POST où le tableau est passé dans les données de la demande plutôt que dans l’URL elle-même.
Le classeur de modèle par défaut attend cette URL:
http://localhost:54119/Designs/Multiple?ids=24041&ids=24117
afin de lier avec succès à:
public ActionResult Multiple(int[] ids) { ... }
Et si vous voulez que cela fonctionne avec des valeurs séparées par des virgules, vous pouvez écrire un modèle de classeur personnalisé:
public class IntArrayModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (value == null || ssortingng.IsNullOrEmpty(value.AttemptedValue)) { return null; } return value .AttemptedValue .Split(',') .Select(int.Parse) .ToArray(); } }
et puis vous pouvez appliquer ce modèle de liant à un argument d’action particulier:
public ActionResult Multiple([ModelBinder(typeof(IntArrayModelBinder))] int[] ids) { ... }
ou l’appliquer globalement à tous les parameters de tableau entier dans votre Application_Start
dans Global.asax
:
ModelBinders.Binders.Add(typeof(int[]), new IntArrayModelBinder());
et maintenant votre action de contrôleur pourrait ressembler à ceci:
public ActionResult Multiple(int[] ids) { ... }
Vous pouvez également utiliser ce format d’URL et ASP.NET MVC fera tout pour vous. Mais n’oubliez pas d’appliquer le codage d’URL.
?param1[0]=3344¶m1[1]=2222
Pour étendre la réponse de Darin Dimitrov , vous pouvez vous contenter d’accepter une simple ssortingng
dans votre paramètre URL et de la convertir en un tableau:
public ActionResult Multiple(ssortingng ids){ int[] idsArray = ids.Split(',').Select(int.Parse).ToArray(); /* ...process results... */ }
Si vous obtenez une erreur d’parsing lors de cette opération (car quelqu’un vous a transmis un tableau mal formé), vous pouvez faire en sorte que votre gestionnaire d’exceptions renvoie une erreur 400 Bad Request
au lieu de 404 Not Found
Erreur 404 Not Found
par défaut. pas trouvé.
Je ne sais pas d’où venait la chaîne d’URL de Groky, mais j’avais le même problème avec certains javascript appelant mon contrôleur / action. Il créerait une URL de null
, 1 ou plusieurs “ID” à partir d’une liste à sélection multiple (unique pour la solution que je vais partager).
J’ai copié / collé le modèle de classeur personnalisé de Darin et décoré mon action / paramètre, mais cela n’a pas fonctionné. J’ai toujours des int[] ids
null
. Même dans le cas “sûr” où j’ai effectivement eu beaucoup d’ID.
J’ai fini par changer le javascript pour produire un tableau de parameters convivial ASP.NET MVC comme
?ids=1&ids=2
Je devais faire des trucs idiots, bien que
ids || [] #=> if null, get an empty array [ids || []] #=> if a single item, wrap it in an array [].concat.apply([], ...) #=> in case I wrapped an array, flatten it
Donc, le bloc entier était
ids = [].concat.apply([], [ids || []]) id_parameter = 'ids=' + ids.join('&ids=')
C’est désordonné, mais c’est la première fois que je dois pirater comme ça en javascript.