web-dev-qa-db-fra.com

La vue «Erreur» ou son maître est introuvable

J'ai passé beaucoup de temps à essayer de trouver une solution à ce problème, mais j'ai pensé que je verrais si quelqu'un ici a une idée.

J'utilise Elmah dans mon application ASP.NET MVC . J'utilise exactement le même code que la réponse acceptée dans le lien précédent.

J'ai également ce code dans mon Global.asax pour afficher les pages d'erreur avec la réponse HTTP correcte:

    /// <summary>
    /// The customErrors functionality provided by ASP.NET results in HTTP 302 redirects occurring which doesn't accurately reflect what the real HTTP code of the response was.
    /// This method can be used to handle specific HTTP codes without an intermediate redirect.
    /// </summary>
    protected void Application_Error() {
        var exception = Server.GetLastError();
        var httpException = exception as HttpException;
        Response.Clear();
        Server.ClearError();
        var routeData = new RouteData();
        routeData.Values["controller"] = "Error";
        routeData.Values["action"] = "Error500";
        Response.StatusCode = 500;

        if (httpException != null) {
            Response.StatusCode = httpException.GetHttpCode();
            Response.TrySkipIisCustomErrors = true;
            switch (Response.StatusCode) {
                case 403:
                    routeData.Values["action"] = "Error403";
                    break;
                case 404:
                    routeData.Values["action"] = "Error404";
                    routeData.Values["message"] = httpException.Message;
                    break;
                case 500:
                    routeData.Values["action"] = "Error500";
                    break;
            }
        }

        IController errorsController = new ErrorController();
        var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
        errorsController.Execute(rc);
    }

Le problème se produit lorsque je ne suis pas sur ma machine de développement (locale) (ce qui m'a initialement fait penser que c'était customErrors lié). Lorsqu'une exception est levée, Elmah gère l'erreur et l'enregistre correctement. Je me retrouve également sur la bonne page d'erreur. Cependant, avant de me retrouver sur la page d'erreur correcte, je peux voir une autre exception intermédiaire en cours d'enregistrement:

The view 'Error' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/Articles/Error.aspx ~/Views/Articles/Error.ascx ~/Views/Shared/Error.aspx ~/Views/Shared/Error.ascx ~/Views/Articles/Error.cshtml ~/Views/Articles/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml

ASP.NET tente de charger une page d'erreur par défaut même si j'essaie de la gérer. Quelqu'un at-il des idées sur la façon de prévenir cela?

34
Justin Helgerson

N'appelez pas la méthode base.OnException(context); dans votre gestionnaire d'erreurs personnalisé qui dérive de HandleErrorAttribute. Vous n'en avez plus besoin car vous avez implémenté une gestion des erreurs personnalisée dans Application_Error.

30
Darin Dimitrov

J'avais ce même problème, mais je n'exécutais nulle part base.OnException (). Une autre solution possible était de supprimer cela de <system.web> dans mon web.config:

<customErrors mode="On" />
15
josh-sachs

Quelque part, votre site essaie de naviguer vers ~/Erreur et il ne le trouve pas car il n'existe pas.

Essayer de supprimer ou de désactiver customErrors dans votre Web.config. Je souhaite que sa valeur par défaut soit on et que je redirige vers ~/Error

Si vous souhaitez publier votre Web.config (en omettant toute information sensible), je peux probablement vous aider. J'ai récemment rencontré des problèmes similaires avec Elmah.

3
Terry

Si vous utilisez Elmah.MVC et souhaitez utiliser des pages d'erreur personnalisées, remplacez simplement la valeur ci-dessous par true dans votre Web.config:

<add key="elmah.mvc.disableHandleErrorFilter" value="true" />

Cela gardera la journalisation Elmah activée mais l'empêchera d'essayer de rediriger vers la page d'erreur par défaut.

3
CapnChaos

Si vous utilisez Elmah.mvc, cela vous aidera à changer ces paramètres sur true:

<add key="elmah.mvc.disableHandler" value="true" />
<add key="elmah.mvc.disableHandleErrorFilter" value="true" />
1
Peter