Routage: la demande d’action en cours est ambiguë entre les méthodes d’action suivantes

J’ai une vue appelée Browse.chtml , où l’utilisateur peut saisir un terme de recherche ou laisser le terme de recherche vide. Lorsque vous entrez le terme de recherche, je veux diriger la page vers http://localhost:62019/Gallery/Browse/{Searchterm} et lorsque rien n’est entré, je veux diriger le navigateur vers http://localhost:62019/Gallery/Browse/Start/Here .

Quand j’essaye ceci, j’obtiens l’erreur:

La demande d’action en cours «Parcourir» sur le type de contrôleur «GalleryController» est ambiguë entre les méthodes d’action suivantes: System.Web.Mvc.ActionResult Browse (System.Ssortingng) sur le type AutoApp_MVC.Controllers.GalleryController System.Web.Mvc.ActionResult Browse (Int32, System.Ssortingng) sur le type AutoApp_MVC.Controllers.GalleryController

Tout ce que je fais avec MVC est pour la première fois. Je ne sais pas quoi d’autre à essayer à ce stade.

 public ActionResult Browse(ssortingng id) { var summaries = /* search using id as search term */ return View(summaries); } public ActionResult Browse(ssortingng name1, ssortingng name2) { var summaries = /* default list when nothing entered */ return View(summaries); } 

J’ai aussi ceci dans Global.asax.cs:

  routes.MapRoute( "StartBrowse", "Gallery/Browse/{s1}/{s2}", new { controller = "Gallery", action = "Browse", s1 = UrlParameter.Optional, s2 = UrlParameter.Optional }); routes.MapRoute( "ActualBrowse", "Gallery/Browse/{searchterm}", new { controller = "Gallery", action = "Browse", searchterm=UrlParameter.Optional }); 

Vous ne pouvez avoir qu’un maximum de 2 méthodes d’action portant le même nom sur un contrôleur, et pour ce faire, 1 doit être [HttpPost] et l’autre doit être [HttpGet] .

Comme vos deux méthodes sont GET, vous devez renommer l’une des méthodes d’action ou la déplacer vers un autre contrôleur.

Bien que vos méthodes 2 Browse soient des surcharges C # valides, le sélecteur de méthode d’action MVC ne peut pas déterminer la méthode à appeler. Il essaiera de faire correspondre une route à la méthode (ou vice versa), et cet algorithme n’est pas fortement typé.

Vous pouvez accomplir ce que vous voulez en utilisant des routes personnalisées pointant vers différentes méthodes d’action:

… dans Global.asax

 routes.MapRoute( // this route must be declared first, before the one below it "StartBrowse", "Gallery/Browse/Start/Here", new { controller = "Gallery", action = "StartBrowse", }); routes.MapRoute( "ActualBrowse", "Gallery/Browse/{searchterm}", new { controller = "Gallery", action = "Browse", searchterm = UrlParameter.Optional }); 

… et dans le contrôleur …

 public ActionResult Browse(ssortingng id) { var summaries = /* search using id as search term */ return View(summaries); } public ActionResult StartBrowse() { var summaries = /* default list when nothing entered */ return View(summaries); } 

Vous pourriez également être en mesure de conserver les méthodes d’action nommées dans le contrôleur , en appliquant un atsortingbut [ActionName] à l’un pour le distinguer. En utilisant le même Global.asax que ci-dessus, votre contrôleur ressemblerait alors à ceci:

 public ActionResult Browse(ssortingng id) { var summaries = /* search using id as search term */ return View(summaries); } [ActionName("StartBrowse")] public ActionResult Browse() { var summaries = /* default list when nothing entered */ return View(summaries); } 

Je ne sais pas quand la question a été posée, cette solution était disponible mais vous pouvez utiliser:

 Request.QuerySsortingng["key"] 

Cela devrait donc fonctionner correctement pour votre problème:

 [HttpGet] public ActionResult Browse() { if( Request.QuerySsortingng["id"] != null ) var summaries = /* search using id as search term */ else /*assuming you don't have any more option*/ var summaries = /* default list when nothing entered */ return View(summaries); } 

Je pense que le fait est que vous n’avez pas besoin de tester implicitement les parameters de la chaîne de requête à l’aide de la classe de requête.

MVC effectue le mappage pour vous (sauf si vous avez apporté des modifications importantes à vos routes MVC).

Ainsi, un chemin de lien d’action de

 /umbraco/Surface/LoginSurface/Logout?DestinationUrl=/home/ 

serait automatiquement disponible pour votre contrôleur (de surface) avec le paramètre défini:

 public ActionResult Logout(ssortingng DestinationUrl) 

MVC fait le travail.