105 votes

Routage: La demande actuelle de l'action [...] est ambigu entre les méthodes d'action

J'ai une Vue appelée Parcourir.chtml, où l'utilisateur peut entrer un terme de recherche, ou de quitter le terme de recherche vide. Lorsque vous entrez le terme de recherche, je veux direct à la page de "http://localhost:62019/Gallery/Browse/{Searchterm}" et quand rien n'est saisi, je veux diriger le navigateur "http://localhost:62019/Gallery/Browse/Start/Here".

Quand j'ai essayer ceci, j'obtiens l'erreur: La demande actuelle de l'action "Parcourir" sur le contrôleur de type 'GalleryController" est ambigu entre l'action suivante méthodes: Système.Web.Mvc.ActionResult De Navigation(Système D'.Chaîne de caractères) sur le type de AutoApp_MVC.Les contrôleurs.GalleryController Système.Web.Mvc.ActionResult Parcourir(Int32, Système.Chaîne de caractères) sur le type de AutoApp_MVC.Les contrôleurs.GalleryController

Tout ce que je fais avec MVC est pour la première fois. Je ne suis pas sûr de ce que d'autre à essayer à ce point.

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult Browse(string name1, string name2)
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

J'ai aussi ce Mondial.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
         });

168voto

danludwig Points 19213

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

Puisque les deux méthodes sont OBTENIR, vous devez renommer l'une des méthodes d'action ou le déplacer vers un autre contrôleur.

Si votre 2 Parcourir les méthodes sont valables C# surcharges, la MVC action sélecteur de la méthode ne pouvez pas comprendre la méthode à appeler. Il va essayer de faire correspondre un itinéraire à la méthode (ou vice versa), et cet algorithme est pas fortement typé.

Vous pouvez accomplir ce que vous souhaitez à l'aide des itinéraires personnalisés pointant vers les différentes méthodes d'action:

... Mondiale.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(string 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 garder les méthodes d'action avec le même nom dans le contrôleur, en appliquant un [ActionName] attribut à un afin de les distinguer. En utilisant la même Mondial.asax comme ci-dessus, votre contrôleur ressemblerait alors à ceci:

public ActionResult Browse(string 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);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X