web-dev-qa-db-fra.com

Une méthode d'action publique '..' n'a pas été trouvée sur le contrôleur '..'

Je voulais mettre une image aléatoire sur chaque page de mon projet MVC. J'ai donc créé une méthode qui retourne une partialView et appelle cette méthode dans la page de mise en page partagée.

Cela fonctionne bien lorsque j'essaie de me connecter avec un nom d'utilisateur et un mot de passe corrects. Le utilisé est connecté et chaque page contient une image aléatoire. Mais quand je donne la combinaison invalide de nom d'utilisateur et mot de passe. La page de disposition partagée ne trouve pas le contrôleur que je souhaite appeler avec mon @Html.Action et la vue de connexion doit être renvoyée avec un message d'erreur "combinaison incorrecte de nom d'utilisateur et mot de passe" et bien sûr, avec l'image aléatoire. 

InnerException:

{"Une méthode d'action publique 'RandomSponsor' n'a pas été trouvée sur le contrôleur 'Project.WebUI.Controllers.HomeController'."}

Mon Html.Action en disposition partagée.

@Html.Action("RandomSponsor", "Home")

Méthode dans homecontroller.

    [HttpGet]   
[ChildActionOnly]
public ActionResult RandomSponsor()
{
    var model = service.getRandomSponsor();
    return PartialView("RandomSponsor", model);
}

La méthode getRandomSponsor fonctionne correctement, celle-ci renvoie toujours une valeur de chaîne aléatoire renvoyée à la vue RandomSponsor.cshtml.

RandomSponsor.schtml (ne contient que la chaîne de l'image)

<img src="~/Content/Images/Advert/@(Model)" alt="a" />

J'ai cherché ce problème sur le Web, mais je n'ai pas trouvé de solution. Quelqu'un connaît-il la réponse à cette question? Peut-il s'agir de quelque chose avec HttpGet de HttpPost?

Cordialement.

35
Gijs

Si la demande en cours d'exécution est une POST, elle essaiera de trouver une méthode RandomSponsor acceptant HttpPost. Si cela vous semble logique, vous pouvez supprimer HttpGet et cela devrait suffire.

71
Claudio Redi

Cela peut également arriver si vous avez plusieurs couches d'appels commençant par un POST (une action renvoyant une vue renvoyant une vue partielle appelant RenderAction), l'appel de RenderAction recherchant toujours un POST méthode

Très similaire à ce problème que j'ai ici - Comment résoudre "méthode d'action publique 'methodActionName' n'a pas été trouvé sur le contrôleur 'controllerNameController'"

Et si vous souhaitez continuer à accepter le verbe HTTP GET et à résoudre le problème de la publication d'une requête en cascade dans une requête get, ajoutez-le à votre méthode. 

[AcceptVerbs (HttpVerbs.Get | HttpVerbs.Post)]

Gardez à l'esprit que [HttpGet] est identique à [AcceptVerbs (HttpVerbs.Get)]

Je sais que c'est un vieux fil de fer - mais comme c'est le principal résultat de Google, j'ai pensé ajouter un lien potentiellement manquant pour MVC.Net 5.2.6.

Scénario

J'essayais d'appeler une action enfant via @Html.Action("ActionName", new { Id = 123}) J'ai reçu une erreur très semblable à celle ci-dessus, mais aucune des autres solutions n'a fonctionné. Je pouvais frapper l’action du contrôleur à l’extérieur (c’est-à-dire HttpGet), mais l’action enfant a continué de lancer l’exception et me rendait dingue!

La solution que j'ai trouvée

Après deux allers-retours depuis un certain temps, j'ai commencé à jouer avec mes attributs de routage. J'ai eu le contrôleur mis en place comme:

[Route("{action}")]
[RoutePrefix("Prefix")]
[RouteArea("AreaName")]

Comme il n'y avait qu'une seule action publique que je voulais, "Index", j'ai supprimé {action}, placé un attribut d'itinéraire explicite sur l'action publique et remis mon attribut ChildActionOnly à l'enfant. 

Après cela, je me suis lancé à la course et hop, l’action a été touchée.

Cela vaut peut-être la peine d'essayer si vous obtenez cette erreur lors de l'utilisation du routage par attribut. Remarque J'ai tenté d'acheminer l'action enfant et cela n'a pas fonctionné.

0
Michael Card

A reçu cette erreur tout à coup sur plusieurs vues partielles différentes (pas toutes) lors de la personnalisation d'une installation de MVCForum. Nous n'avions apporté aucun changement aux méthodes ou aux points de vue concernant les erreurs, il était donc vraiment frustrant de savoir pourquoi elles étaient brisées.

Après avoir essayé les autres solutions de ce billet et d’autres, reparlé des modifications apportées, c’est que nous avions modifié les liaisons dans IIS en un autre domaine doté de l’URL "appliquer les minuscules" La règle de réécriture est activée.

Lorsque nous avons désactivé la règle d'application des minuscules, les erreurs se sont arrêtées et le site a fonctionné comme prévu. Ce n'est pas un problème de réécriture d'URL (je ne pense pas), car nous sommes en mesure de faire en sorte que www soit utilisé sans erreur. C'est un problème de réécriture minuscule. Peu importait si nous avions la règle minuscule avant ou après la règle www.

Cette solution ne s'applique probablement pas à de nombreux cas d'erreur, mais cela a fonctionné pour nous. Espérons que quelqu'un d'autre puisse bénéficier d'une solution aussi simple.

0
swimex

Dans mon cas, le même problème se passait au hasard avec l'implicite 

using (Html.BeginForm ())

Changer ci-dessus à

using (Html.BeginForm ("Action", "Contrôleur", FormMethod.Post))

résolu ce problème.

0
tomekole