92 votes

Exception intermittente asp.net mvc : "Une méthode d'action publique ABC n'a pas pu être trouvée sur le contrôleur XYZ."

Je reçois une exception intermittente disant que asp.net mvc ne peut pas trouver la méthode d'action. Voici l'exception :

Une méthode d'action publique "Fill" pourrait ne pas être trouvée sur le contrôleur Schoon.Form.Web.Controllers.ChrisController'.

Je pense avoir configuré le routage correctement car cette application fonctionne la plupart du temps. Voici la méthode d'action du contrôleur.

[ActionName("Fill")]
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post), UserIdFilter, DTOFilter]
public ActionResult Fill(int userId, int subscriberId, DisplayMode? mode)
{
     //…
}

L'itinéraire :

routes.MapRoute(
        "SchoonForm",
        "Form/Fill/{subscriberId}",
        new { controller = "ChrisController", action = "Fill" },
        new { subscriberId = @"\d+" }
    );

Et voici la pile :

System.Web.HttpException : Une action publique d'action publique 'Fill' n'a pas pu être trouvé sur le contrôleur Schoon.Form.Web.Controllers.ChrisController'. à l'adresse System.Web.Mvc.Controller.HandleUnknownAction(String actionName) dans C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\Controller.cs :ligne 197 à System.Web.Mvc.Controller.ExecuteCore() dans C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\Controller.cs :ligne 164 à System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) dans C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\ControllerBase.cs :ligne 76 à System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) dans C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\ControllerBase.cs :ligne 87 à System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) dans C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\MvcHandler.cs :ligne 80 chez System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) dans C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\MvcHandler.cs :ligne 68 à System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) dans C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\MvcHandler.cs :ligne 104 à System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() à l'adresse System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Voici un exemple de mes filtres ; ils fonctionnent tous de la même manière :

public class UserIdFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        const string Key = "userId";

        if (filterContext.ActionParameters.ContainsKey(Key))
        {
            filterContext.ActionParameters[Key] = // get the user id from session or cookie
        }

        base.OnActionExecuting(filterContext);
    }
}

Merci, Chris

28 votes

J'ai eu un problème similaire qui, je pense, mérite d'être signalé ici car c'est le premier résultat qui est apparu dans Google lors de la recherche de l'exception ci-dessus. Mon application a généré cette exception lors de la soumission d'un formulaire invalide. Cela était dû au fait que la page qui était (re)rendue appelait RenderAction et que l'action qui était appelée pour rendre une vue partielle était marquée avec l'attribut HttpGet, la suppression de cet attribut a résolu le problème.

3 votes

J'ai également remarqué ce comportement - peut-être est-il préférable de ne pas appliquer d'attributs Http aux méthodes du contrôleur qui renvoient des PartialViewResults.

1 votes

@s1mm0t : a raison. Pour mon cas, son commentaire a résolu le problème.

0voto

Proka Points 116

Retirer le [HttpGet] attributs et cela fonctionnera :)

1 votes

Bien que cela "résout" les erreurs, il est probable que vous (ou quelqu'un avant vous) ayez mis ces [HttpGet] afin d'éviter que les actions ne soient appelées par d'autres VERBs.

0voto

davaus Points 71

Pour tous ceux qui rencontrent ce problème avec angularjs, MVC et les insertions de type {{imagepath}} dans les attributs src des images, par exemple :

"Une méthode d'action publique '{{imagepath}}previous.png' n'a pas été trouvée sur le contrôleur"

La solution consiste à utiliser ng-src au lieu de src.

J'espère que cela aidera quelqu'un :)

0 votes

Presque un an plus tard, je cherchais ceci :) tnx !

0voto

Tawab Wakil Points 355

Voyez si le simple fait de naviguer vers l'URL en question suffit à reproduire l'erreur. Ce serait le cas si l'action était uniquement définie comme une action POST. En procédant ainsi, vous pouvez reproduire l'erreur à volonté.

Dans tous les cas, vous pouvez traiter globalement l'erreur comme ci-dessous. Une autre réponse ici qui fait référence HandleUnknownAction ne traite que les URL avec des noms d'action incorrects, pas les noms de contrôleur incorrects. L'approche suivante gère les deux.

Ajoutez ceci à votre contrôleur de base (code de vue omis ici) :

public ActionResult Error(string errorMessage)
{
    return View("Error");  // or do something like log the error, etc.
}

Ajoutez un gestionnaire d'exception global à Global.asax.cs qui appelle la méthode ci-dessus ou fait tout ce que vous voulez faire avec l'erreur 404 détectée :

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();  // get the exception object
    HttpException httpException = ex as HttpException;

    if (httpException != null && httpException.GetHttpCode() == 404)  // if action not found
    {
        string errorMessage = "The requested page was not found.";

        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "Base");
        routeData.Values.Add("action", "Error");
        routeData.Values.Add("errorMessage", errorMessage);

        Server.ClearError();
        Response.TrySkipIisCustomErrors = true;

        // Go to our custom error view.
        IController errorController = new BaseController();
        errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    }
}

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