J'ai un code de base pour déterminer les erreurs dans mon application MVC. À l' heure actuelle dans mon projet , j'ai appelé un contrôleur Error
avec des méthodes d'action HTTPError404()
, HTTPError500()
et General()
. Ils acceptent tous un paramètre de chaîne error
. Utilisation ou modification du code ci-dessous. Quelle est la meilleure / la manière appropriée de transmettre les données au contrôleur d'erreur pour traitement? J'aimerais avoir une solution la plus robuste possible.
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
if (httpException != null)
{
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
switch (httpException.GetHttpCode())
{
case 404:
// page not found
routeData.Values.Add("action", "HttpError404");
break;
case 500:
// server error
routeData.Values.Add("action", "HttpError500");
break;
default:
routeData.Values.Add("action", "General");
break;
}
routeData.Values.Add("error", exception);
// clear error on server
Server.ClearError();
// at this point how to properly pass route data to error controller?
}
}
Pour répondre à la question initiale "comment transmettre correctement les données de routage au contrôleur d'erreur?":
Ensuite, dans votre classe ErrorController, implémentez une fonction comme celle-ci:
Cela pousse l'exception dans la vue. La page d'affichage doit être déclarée comme suit:
Et le code pour afficher l'erreur:
Voici la fonction qui rassemble tous les messages d'exception de l'arborescence d'exceptions:
la source
J'ai trouvé une solution pour le problème ajax noté par Lion_cl.
global.asax:
ErrorPagesController
AjaxRedirectResult
AjaxRequestExtension
la source
J'ai eu du mal avec l'idée de centraliser une routine globale de gestion des erreurs dans une application MVC auparavant. J'ai un message sur les forums ASP.NET .
Il gère essentiellement toutes vos erreurs d'application dans le global.asax sans avoir besoin d'un contrôleur d'erreur, de décorer avec l'
[HandlerError]
attribut ou de jouer avec lecustomErrors
nœud dans le web.config.la source
Une meilleure façon de gérer les erreurs dans MVC consiste peut-être à appliquer l'attribut HandleError à votre contrôleur ou à votre action et à mettre à jour le fichier Shared / Error.aspx pour faire ce que vous voulez. L'objet Model sur cette page comprend une propriété Exception ainsi que ControllerName et ActionName.
la source
404
erreur alors? puisqu'il n'y a pas de contrôleur / d'action désigné pour cela?Perhaps a better way of handling errors
sonne à peu près comme Toutes les erreurs et pas seulement 500.Application_Error ayant un problème avec les requêtes Ajax. Si une erreur est gérée dans l'action qui a été appelée par Ajax - il affichera votre vue d'erreur dans le conteneur résultant.
la source
Ce n'est peut-être pas le meilleur moyen pour MVC ( https://stackoverflow.com/a/9461386/5869805 )
Voici comment rendre une vue dans Application_Error et l'écrire dans la réponse http. Vous n'avez pas besoin d'utiliser la redirection. Cela empêchera une deuxième demande au serveur, de sorte que le lien dans la barre d'adresse du navigateur restera le même. Cela peut être bon ou mauvais, cela dépend de ce que vous voulez.
Global.asax.cs
Vue
la source
Brian, Cette approche fonctionne très bien pour les requêtes non Ajax, mais comme Lion_cl l'a déclaré, si vous rencontrez une erreur lors d'un appel Ajax, votre vue Share / Error.aspx (ou votre vue de page d'erreur personnalisée) sera renvoyée à l'appelant Ajax- -l'utilisateur ne sera PAS redirigé vers la page d'erreur.
la source
Utilisez le code suivant pour la redirection sur la page d'itinéraire. Utilisez exception.Message instide of exception. La chaîne de requête d'exception Coz donne une erreur si elle étend la longueur de la chaîne de requête.
la source
J'ai un problème avec cette approche de gestion des erreurs: Dans le cas de web.config:
Le gestionnaire d'erreurs recherche la vue Error.shtml et l'étape de flux de contrôle dans Application_Error global.asax uniquement après une exception
Alors
httpException est toujours null alors customErrors mode = "On" :( C'est trompeur Alors
<customErrors mode="Off"/>
ou<customErrors mode="RemoteOnly"/>
les utilisateurs voient customErrors html, Then customErrors mode = "On" ce code est également fauxUn autre problème de ce code qui
Page de retour avec le code 302 à la place du code d'erreur réel (402, 403, etc.)
la source