2013-06-05 2 views
26

je voulais mettre une image au hasard sur tous les ViewPage de mon projet mvc. J'ai donc créé une méthode qui retourne un partialView et appelle cette méthode dans la page Layout partagée.Une méthode d'action publique « .. » n'a pas été trouvé sur le contrôleur « .. »

Cela fonctionne bien lorsque je tente de se connecter avec un nom d'utilisateur et mot de passe. L'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 mise en page partagée ne trouve pas le contrôleur que je veux appeler avec mon @Html.Action et la vue de connexion devrait être retournée avec un message d'erreur «combinaison invalide 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é sur le contrôleur 'Project.WebUI.Controllers.HomeController'"}

Mon Html.Action en commun disposition.

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

Méthode dans le homecontroller.

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

La méthode getRandomSponsor fonctionne très bien, celui-ci renvoie toujours une valeur de chaîne aléatoire qui est 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" /> 

Je recherche sur le web pour ce problème, mais n'a pas trouvé une solution, personne ne sait la réponse à celle-ci? Serait-il quelque chose avec HttpGet de HttpPost?

Cordialement.

+0

pouvez-vous poster votre définition de table de route? (RegisterRoutes dans global.asax) et également la définition de contrôleur qui a l'action RandomSponsor(). –

+0

J'ai ouvert un bug pour ce https://aspnetwebstack.codeplex.com/workitem/2295 –

+0

Je recevais la même erreur en utilisant Mozilla Firefox 45. Faire la même chose avec Google Chrome 48.0.2564.116 m, le problème est parti. Dans mon cas, il y a du JavaScript et je pense que c'est le problème. – JayJay

Répondre

59

Si la demande d'exécution est un POST, il va essayer de trouver une méthode RandomSponsor accepter HttpPost. Si logique, vous pouvez supprimer HttpGet et qui devrait faire l'affaire.

Cela peut également se produire si vous avez plusieurs couches d'appels qui commencent par un POST (j'ai eu une action de retour une vue, renvoyant une vue partielle appelant RenderAction), l'appel à RenderAction sera toujours une méthode POST

+7

Ok, j'ai vu ça et ça ne s'est pas enregistré au début; Si vous avez * plusieurs couches * d'appels qui commencent par un POST (j'ai eu une action retournant une vue retournant une vue partielle appelant RenderAction), l'appel à RenderAction recherchera * encore * une méthode POST. J'espère que cela empêchera quelqu'un d'y passer quatre heures :) –

+1

Comment résoudre ce problème en ne supprimant pas l'attribut [HttpGet] '? Je veux envoyer des valeurs de route à la méthode par GET, pas POST. – pt12lol

+0

Oh j'ai trouvé une solution. La vue a été appelée par POST et cela exclu le chargement de '@ Html.Action()' par GET. – pt12lol

-1

Avez-vous essayé avec Html.RenderAction? Il est généralement plus rapide que Html.Action car il interagit directement dans le flux de réponse par opposition à la construction d'une chaîne.

Vous pouvez consulter les rubriques suivantes pour plus d'informations:

Une autre chose à noter est que pour Html.Action ou Html.RenderAction, votre point de vue n'a pas besoin d'être dans Dossier partagé, uniquement requis si vous utilisez Html.Partial ou Html.RenderPartial

4

Cela peut également se produire si vous avez plusieurs couches d'appels qui commencent par un POST (j'ai eu une action de retour en vue de retourner une vue partielle appelant RenderAction), l'appel à RenderAction sera toujours une méthode POST

très similaire à ce problème que j'avais ici - How to solve "public action method 'methodActionName' was not found on controller 'controllerNameController'"

et si vous voulez continuer à accepter le verbe HTTP GET et résoudre le problème de la demande de poste en cascade dans une requête get ajouter à votre méthode

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

Gardez à l'esprit que [HttpGet] est le même que [AcceptVerbs (HttpVerbs.Get)]

0

cette erreur Reçu tout à coup sur plusieurs PartialViews différents (pas tous eux) lors de la personnalisation d'une installation de MVCForum. Nous n'avions pas apporté de changements aux méthodes ou aux points de vue concernant les erreurs, alors c'était vraiment frustrant de savoir pourquoi ils étaient cassés. Après avoir essayé les autres solutions sur ce post et d'autres, j'ai revu les modifications apportées et ce qui a fini par arrêter les erreurs, c'est que nous avions changé les liens dans IIS vers un autre domaine qui avait l'URL 'enforcer l'URL de la minuscule' La règle de réécriture est activée. Lorsque nous avons désactivé la règle de mise en vigueur en minuscules, les erreurs se sont arrêtées et le site a fonctionné comme il était supposé le faire. Ce n'est pas un problème de réécriture d'URL (je ne pense pas) parce que nous sommes en mesure d'imposer www en l'utilisant sans erreurs. C'est un problème de réécriture en minuscules. Peu importe si nous avions la règle en minuscule avant ou après la règle www.

Cette solution ne s'applique probablement pas à de nombreux cas de cette erreur, mais cela a fonctionné pour nous. J'espère que quelqu'un d'autre peut bénéficier d'une solution aussi simple.

Questions connexes