144 votes

Pages d’erreur personnalisées sur asp.net MVC3

Je suis l'élaboration d'un MVC3 site web de base et je suis à la recherche d'une solution pour la gestion des erreurs et de Rendre des Vues personnalisées pour chaque type d'erreur. Alors, imaginez que j'ai une "Erreur" Contrôleur de où son action principale est "Index" (page d'erreur générique) et le contrôleur aura un couple plus d'actions pour les erreurs qui peuvent apparaître à l'utilisateur comme "Handle500" ou "HandleActionNotFound".

Donc, de toutes les erreurs qui peuvent se produire sur le site web peuvent être gérées par cette "Erreur" Contrôleur (exemples: "Contrôleur" ou "Action" n'est pas trouvée, 500, 404, dbException, etc).

Je suis à l'aide de fichier Sitemap pour définir le site web des chemins (et pas de route).

Cette question a déjà été répondu, c'est une réponse à Gweebz

Ma dernière applicaiton_error méthode est la suivante:

protected void Application_Error() {
//while my project is running in debug mode
if (HttpContext.Current.IsDebuggingEnabled && WebConfigurationManager.AppSettings["EnableCustomErrorPage"].Equals("false"))
{
    Log.Logger.Error("unhandled exception: ", Server.GetLastError());
}
else
{
    try
    {
        var exception = Server.GetLastError();

        Log.Logger.Error("unhandled exception: ", exception);

        Response.Clear();
        Server.ClearError();
        var routeData = new RouteData();
        routeData.Values["controller"] = "Errors";
        routeData.Values["action"] = "General";
        routeData.Values["exception"] = exception;

        IController errorsController = new ErrorsController();
        var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
        errorsController.Execute(rc);
    }
    catch (Exception e)
    {
        //if Error controller failed for same reason, we will display static HTML error page
        Log.Logger.Fatal("failed to display error page, fallback to HTML error: ", e);
        Response.TransmitFile("~/error.html");
    }
}
}

201voto

Darin Dimitrov Points 528142

Voici un exemple de comment traiter les erreurs personnalisées. Je définis une `` avec des actions de gestion des erreurs HTTP différents :

et puis je vous abonner pour la en et invoquer ce contrôleur :

18voto

Shaman Points 643

Voici d’autres articles comment créer des pages d’erreur personnalisées avec MVC http://kitsula.com/Article/MVC-Custom-Error-Pages.

6voto

Brett Allred Points 1993

Vous pouvez également faire ceci dans le fichier Web.Config. Voici un exemple qui fonctionne dans IIS 7.5.

3voto

Simon_Weaver Points 31141

Je vois que vous avez ajouté une valeur de configuration pour EnableCustomErrorPage et vous êtes aussi en vérifiant IsDebuggingEnabled afin de déterminer si ou de ne pas exécuter votre erreur de manipulation.

Puisqu'il y a déjà un <customErrors/> configuration dans ASP.NET (ce qui signifie exactement pour cette raison), il est plus facile de dire simplement :

    protected void Application_Error()
    {
        if (HttpContext.Current == null) 
        {
                // errors in Application_Start will end up here                
        }
        else if (HttpContext.Current.IsCustomErrorEnabled)
        {
                // custom exception handling
        }
    }

Ensuite, dans la configuration que vous les mettiez <customErrors mode="RemoteOnly" /> ce qui est sûr pour déployer comme ça, et quand vous avez besoin de tester votre page d'erreur personnalisée, vous devez mettre la valeur <customErrors mode="On" /> de sorte que vous pouvez vérifier qu'elle fonctionne.

Remarque vous devez également vérifier si HttpContext.Current est nulle, car une exception en Application_Start sera à lui de cette méthode bien qu'il n'y aura pas un contexte actif.

2voto

Martin_ATS Points 395

Vous pouvez afficher une page d'erreur convivial avec le bon code d'état http, par la mise en œuvre de Jeff Atwood est Conviviale la gestion des exceptions module avec une légère modification pour le code d'état http. Elle fonctionne sans redirections. Bien que le code est à partir de 2004(!), il fonctionne bien avec MVC. Il peut être configuré entièrement de votre site web.config, sans MVC projet de modification du code source.

La modification nécessaire de retourner l'original HTTP statut plutôt qu'un 200 état est décrit dans ce post sur le forum.

Fondamentalement, dans le Gestionnaire.vb, vous pouvez ajouter quelque chose comme:

' In the header...
Private _exHttpEx As HttpException = Nothing

' At the top of Public Sub HandleException(ByVal ex As Exception)...
HttpContext.Current.Response.StatusCode = 500
If TypeOf ex Is HttpException Then
    _exHttpEx = CType(ex, HttpException)
    HttpContext.Current.Response.StatusCode = _exHttpEx.GetHttpCode()
End If

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