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.