Ich habe einen grundlegenden Code, um Fehler in meiner MVC-Anwendung zu ermitteln. Zur Zeit in meinem Projekt habe ich einen Controller namens Error
mit Aktionsmethoden HTTPError404()
, HTTPError500()
und General()
. Sie alle akzeptieren einen String-Parameter error
. Verwenden oder Ändern des folgenden Codes. Was ist der beste / richtige Weg, um die Daten zur Verarbeitung an den Fehlercontroller zu übergeben? Ich hätte gerne eine möglichst robuste Lösung.
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?
}
}
quelle
So beantworten Sie die erste Frage: "Wie werden Routedaten ordnungsgemäß an den Fehlercontroller übergeben?":
Implementieren Sie dann in Ihrer ErrorController-Klasse eine Funktion wie die folgende:
Dadurch wird die Ausnahme in die Ansicht verschoben. Die Ansichtsseite sollte wie folgt deklariert werden:
Und der Code zur Anzeige des Fehlers:
Hier ist die Funktion, die alle Ausnahmemeldungen aus dem Ausnahmebaum sammelt:
quelle
Ich habe eine Lösung für das von Lion_cl festgestellte Ajax-Problem gefunden.
global.asax:
ErrorPagesController
AjaxRedirectResult
AjaxRequestExtension
quelle
Ich hatte zuvor Probleme mit der Idee, eine globale Fehlerbehandlungsroutine in einer MVC-App zu zentralisieren. Ich habe einen Beitrag in den ASP.NET-Foren .
Grundsätzlich werden alle Ihre Anwendungsfehler in der Datei global.asax behandelt, ohne dass ein Fehlercontroller erforderlich ist, der mit dem
[HandlerError]
Attribut dekoriert oder mit demcustomErrors
Knoten in der Datei web.config herumgespielt hat.quelle
Eine bessere Möglichkeit, Fehler in MVC zu behandeln, besteht darin, das HandleError-Attribut auf Ihren Controller oder Ihre Aktion anzuwenden und die Datei Shared / Error.aspx zu aktualisieren, um das zu tun, was Sie möchten. Das Model-Objekt auf dieser Seite enthält eine Exception-Eigenschaft sowie ControllerName und ActionName.
quelle
404
Fehler umgehen ? da dafür kein Controller / keine Aktion vorgesehen ist?Perhaps a better way of handling errors
klingt ziemlich nach All Errors und nicht nur nach 500.Application_Error hat ein Problem mit Ajax-Anforderungen. Wenn ein Fehler in einer von Ajax aufgerufenen Aktion behandelt wird, wird Ihre Fehleransicht im resultierenden Container angezeigt.
quelle
Dies ist möglicherweise nicht der beste Weg für MVC ( https://stackoverflow.com/a/9461386/5869805 ).
Im Folgenden wird beschrieben, wie Sie eine Ansicht in Application_Error rendern und in die http-Antwort schreiben. Sie müssen die Umleitung nicht verwenden. Dadurch wird eine zweite Anforderung an den Server verhindert, sodass der Link in der Adressleiste des Browsers unverändert bleibt. Dies kann gut oder schlecht sein, es hängt davon ab, was Sie wollen.
Global.asax.cs
Aussicht
quelle
Brian, Dieser Ansatz eignet sich hervorragend für Nicht-Ajax-Anforderungen. Wenn jedoch während eines Ajax-Aufrufs ein Fehler auftritt, wird Ihre Share / Error.aspx-Ansicht (oder Ihre benutzerdefinierte Fehlerseitenansicht) an den Ajax-Aufrufer zurückgegeben. -Der Benutzer wird NICHT zur Fehlerseite weitergeleitet.
quelle
Verwenden Sie den folgenden Code zum Umleiten auf der Routenseite. Verwenden Sie exception.Message instide of exception. Die Coz-Ausnahme-Abfragezeichenfolge gibt einen Fehler aus, wenn sie die Länge des Querystrings erweitert.
quelle
Ich habe ein Problem mit diesem Fehlerbehandlungsansatz: Im Fall von web.config:
Der Fehlerbehandler durchsucht die Ansicht Error.shtml und den Kontrollflussschritt erst nach einer Ausnahme in Application_Error global.asax
So
httpException ist immer null, dann customErrors mode = "On" :( Es ist irreführend. Dann
<customErrors mode="Off"/>
oder<customErrors mode="RemoteOnly"/>
die Benutzer sehen customErrors html. Then customErrors mode = "On". Dieser Code ist ebenfalls falschEin weiteres Problem dieses Codes ist das
Rückgabeseite mit Code 302 statt echtem Fehlercode (402.403 usw.)
quelle