ASP.NET MVC – Passage de parameters au contrôleur

J’ai un contrôleur avec une méthode d’action comme suit:

public class InventoryController : Controller { public ActionResult ViewStockNext(int firstItem) { // Do some stuff } } 

Et quand je le lance, je reçois une erreur indiquant:

Le dictionnaire de parameters ne contient pas de valeur valide de type ‘System.Int32’ pour le paramètre ‘firstItem’. Pour rendre un paramètre facultatif, son type doit être un type référence ou un type Nullable.

Je l’ai fait travailler à un moment donné et j’ai décidé d’essayer la fonction sans parameters. Constatant que le contrôleur n’était pas persistant, j’ai remis le paramètre, maintenant il refuse de reconnaître le paramètre lorsque j’appelle la méthode.

J’utilise cette syntaxe d’URL pour appeler l’action:

 http://localhost:2316/Inventory/ViewStockNext/11 

Des idées pour lesquelles j’obtiendrais cette erreur et ce que je dois faire pour y remédier?

J’ai essayé d’append une autre méthode qui prend un entier à la classe, elle échoue également avec la même raison. J’ai essayé d’append un qui prend une chaîne et la chaîne est définie sur null. J’ai essayé d’en append un sans parameters et cela fonctionne bien, mais bien sûr, cela ne répondra pas à mes besoins.

Votre routage doit être configuré selon les lignes de {controller}/{action}/{firstItem} . Si vous avez laissé le routage par défaut {controller}/{action}/{id} dans votre fichier global.asax.cs , vous devrez alors transmettre id .

 routes.MapRoute( "Inventory", "Inventory/{action}/{firstItem}", new { controller = "Inventory", action = "ListAll", firstItem = "" } ); 

… Ou quelque chose proche de cela.

vous pouvez changer firstItem en id et cela fonctionnera

vous pouvez modifier le routage sur global.asax (je ne le recommande pas)

et, ne peut pas croire que personne ne l’a mentionné, vous pouvez appeler:

 http://localhost:2316/Inventory/ViewStockNext?firstItem=11 

Dans un @ Url.Action serait:

 @Url.Action("ViewStockNext", "Inventory", new {firstItem=11}); 

selon le type de ce que vous faites, le dernier sera plus approprié. Vous devriez également envisager de ne pas effectuer l’action ViewStockNext et, à la place, une action ViewStock avec index. (mes 2cents)

Pour reformuler la réponse de Jarret Meyer , vous devez changer le nom du paramètre en “id” ou append une route comme celle-ci:

 routes.MapRoute( "ViewStockNext", // Route name "Inventory/ViewStockNext/{firstItem}", // URL with parameters new { controller = "Inventory", action = "ViewStockNext" } // Parameter defaults ); 

La raison en est que la route par défaut recherche uniquement les actions sans paramètre ou un paramètre appelé «id».

Edit: Heh, bien sûr, Jarret a ajouté un exemple d’itinéraire après sa publication.

Headspring a créé une bibliothèque intéressante qui vous permet d’append des alias à vos parameters dans les atsortingbuts de l’action. Cela ressemble à ceci:

 [ParameterAlias("firstItem", "id", Order = 3)] public ActionResult ViewStockNext(int firstItem) { // Do some stuff } 

Avec cela, vous n’avez pas à modifier votre routage juste pour gérer un nom de paramètre différent. La bibliothèque prend également en charge l’application à plusieurs resockets afin que vous puissiez mapper plusieurs orthographes de parameters (pratique lors de la refactorisation sans casser votre interface publique).

Vous pouvez l’obtenir de Nuget et lire l’article de Jeffrey Palermo à ce sujet ici

public ActionResult ViewNextItem(int? id) fait de l’ id integer un type nullable, pas besoin de chaîne <-> int conversions.

ou faites-le avec un atsortingbut de route:

 public class InventoryController : Controller { [Route("whatever/{firstItem}")] public ActionResult ViewStockNext(int firstItem) { int yourNewVariable = firstItem; // ... } } 

Il y a une autre façon d’accomplir cela (décrit plus en détail dans l’ exemple de Stephen Walther dans Pager).

Vous créez essentiellement un lien dans la vue:

 Html.ActionLink("Next page", "Index", routeData) 

Dans routeData, vous pouvez spécifier des paires nom / valeur (par exemple, routeData [“page”] = 5), et dans la fonction Index du contrôleur, les parameters correspondants reçoivent la valeur. C’est,

 public ViewResult Index(int? page) 

J’aurais dû admettre que la chaîne (“page”) devient automatiquement une variable, mais c’est ainsi que MVC fonctionne également dans d’autres langages …

La raison du traitement spécial de “id” est qu’il est ajouté au mappage de route par défaut. Pour changer cela, allez à Global.asax.cs, et vous trouverez la ligne suivante:

 routes.MapRoute ("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" }); 

Changez le pour:

 routes.MapRoute ("Default", "{controller}/{action}", new { controller = "Home", action = "Index" }); 

Ou, vous pouvez essayer de changer le type de paramètre en chaîne, puis convertir la chaîne en un entier dans la méthode. Je suis nouveau sur MVC, mais je pense que vous avez besoin d’objects nullables dans votre liste de parameters, comment le contrôleur pourrait-il indiquer qu’aucun paramètre de ce type n’a été fourni? Alors…

 public ActionResult ViewNextItem(ssortingng id)... 

Utilisation de la fonctionnalité ASP.NET Core Tag Helper:

 @item.Text