Routage ASP.NET MVC avec un paramètre obligatoire et un paramètre facultatif?

J’ai travaillé sur une grande application MVC au cours des derniers mois, mais c’est la première fois que je dois définir un gestionnaire de routage personnalisé. Fondamentalement, j’ai deux parameters à transmettre. Le premier est requirejs et le second est facultatif.

Je suis cette réponse ici .

Voici mon itinéraire personnalisé:

routes.MapRoute( "MyRoute", "{controller}/{action}/{param1}/{param2}", new { controller = "MyController", action = "MyAction", param1 = "", param2 = "" // I have also sortinged "UrlParameter.Optional" here. } ); 

Et ma signature de méthode d’action:

 public ActionResult MyAction(ssortingng param1, ssortingng param2) 

Si j’essaye l’URL http://[myserver]/MyController/MyAction/Test1/Test2 alors cela fonctionnera comme prévu, avec param1 = “Test1” et param2 = “Test2”

Si j’essaie l’URL http://[myserver]/MyController/MyAction/Test1 deux parameters sont nuls.

J’espère que quelqu’un pourra me dire ce que je fais de mal ici, parce que je suis perdu.

Je suppose que vous avez créé un nouvel itinéraire et laissé celui par défaut très similaire au vôtre. Vous devez savoir que la collection de routes est parcourue pour trouver la première route correspondante. Donc, si vous avez laissé celui par défaut:

 routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); 

au-dessus de votre route, la demande sera alors http://[myserver]/My/MyAction/Test1 à http://[myserver]/My/MyAction/Test1 , appelez MyController.MyAction et définissez “Text1” sur le paramètre nommé id . Ce qui échouera car cette action ne déclare pas un id nommé.

Ce que vous devez faire est de déplacer votre itinéraire en premier dans la liste des itinéraires et de le rendre plus spécifique qu’il ne l’est maintenant:

 routes.MapRoute( "Route", "My/{action}/{param1}/{param2}", new { controller = "My", action = "MyAction", param1 = "", param2 = "" }); 

Cela forcera tout le trafic acheminé par My à correspondre à cet itinéraire.

salut vous créez votre déroute comme ça, je pense que cela va vous aider

 routes.MapRoute( "Regis", // Route nameRegister "Artical/{id}", // URL with parameters new { controller = "Artical", action = "Show", id = UrlParameter.Optional } // Parameter defaults ); 

Essaye ça

 routes.MapRoute("MyRoute", "myRoute/{param1 }/{param2 }", new { controller = "MyController", action = "MyAction", param2 = UrlParameter.Optional }, new { param2 = @"\w+" }); 

vous pouvez spécifier un paramètre comme facultatif en utilisant ” UrlParameter.Optional ” et en spécifiant le second avec DataType signifie que si vous transmettez une valeur entière, alors DataType (@ “\ d +”) et la chaîne que j’ai mentionnées ci-dessus.

REMARQUE: la séquence de paramètre est très importante. Le paramètre facultatif doit enfin passer et enregistrer votre nouvelle route Avant la route par défaut dans Gloab.asax .

alors vous lien d’action comme

 Test 

OU avec un paramètre

  Test 

Dans ton contrôleur

  public ActionResult MyAction(ssortingng param2,ssortingng param1) { return View() }