Je développe un site Web de base MVC3 et je recherche une solution pour gérer les erreurs et rendre des vues personnalisées pour chaque type d'erreur. Imaginez donc que j'ai un contrôleur "Erreur" où son action principale est "Index" (page d'erreur générique) et ce contrôleur aura quelques actions supplémentaires pour les erreurs qui peuvent apparaître à l'utilisateur comme "Handle500" ou "HandleActionNotFound".
Ainsi, chaque erreur qui peut survenir sur le site Web peut être gérée par ce contrôleur "Erreur" (exemples: "Contrôleur" ou "Action" introuvable, 500, 404, dbException, etc.).
J'utilise le fichier Sitemap pour définir les chemins du site Web (et non l'itinéraire).
Cette question a déjà été répondue, ceci est une réponse à Gweebz
Ma dernière méthode applicaiton_error 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");
}
}
}
la source
Réponses:
Voici un exemple de la façon dont je gère les erreurs personnalisées. Je définis un
ErrorsController
avec des actions gérant différentes erreurs HTTP:puis je m'abonne au
Application_Error
inGlobal.asax
et j'appelle ce contrôleur:la source
Execute
est une méthode définie dans l'IController
interface. Cela ne peut pas être protégé. Regardez mon code plus attentivement:IController errorsController = new ErrorsController();
et notez le type deerrorsController
variable sur lequel j'invoque laExecute
méthode. C'est de typeIController
donc rien ne vous empêche d'appeler cette méthode. Et d'ailleursExecute
était protégé dans la classe Controller également dans MVC 3, il n'y a donc pas de changement à cet égard.Response.ContentType = "text/html";
Voici plus d'articles Comment créer des pages d'erreur personnalisées avec MVC http://kitsula.com/Article/MVC-Custom-Error-Pages .
la source
Vous pouvez également le faire dans le fichier Web.Config. Voici un exemple qui fonctionne dans IIS 7.5.
la source
Je vois que vous avez ajouté une valeur de configuration pour
EnableCustomErrorPage
et que vous vérifiez égalementIsDebuggingEnabled
si vous souhaitez exécuter ou non votre gestion des erreurs.Puisqu'il existe déjà une
<customErrors/>
configuration dans ASP.NET (qui est destinée exactement à cet effet), il est plus facile de dire simplement:Ensuite, dans la configuration, vous mettez
<customErrors mode="RemoteOnly" />
ce qui est sûr à déployer comme ça, et lorsque vous avez besoin de tester votre page d'erreur personnalisée, vous la définissez sur<customErrors mode="On" />
que vous puissiez vérifier qu'elle fonctionne.Notez que vous devez également vérifier si
HttpContext.Current
est null car une exception dansApplication_Start
cette méthode sera toujours sa cette méthode bien qu'il n'y ait pas de contexte actif.la source
Vous pouvez afficher une page d'erreur conviviale avec le code d'état http correct en implémentant le module User Friendly Exception Handling de Jeff Atwood avec une légère modification du code d'état http. Cela fonctionne sans aucune redirection. Bien que le code date de 2004 (!), Il fonctionne bien avec MVC. Il peut être entièrement configuré dans votre web.config, sans aucune modification du code source du projet MVC.
La modification requise pour renvoyer le statut HTTP d'origine plutôt qu'un
200
statut est décrite dans cet article de forum connexe .Fondamentalement, dans Handler.vb, vous pouvez ajouter quelque chose comme:
la source
J'utilise MVC 4.5 et j'avais des problèmes avec la solution de Darin. Remarque: la solution de Darin est excellente et je l'ai utilisée pour trouver ma solution. Voici ma solution modifiée:
la source