ASP.NET MVC Custom Error Handler Attribute und Ajax Calls


Normalerweise, fange ich die meisten Fehler direkt im Code ab und habe in jedem Ajax Request ein erweitertes Response Model was immer von einer Basisklasse ableitet in dem ich Nachrichten oder Fehlermeldungen mit übergeben kann.

Sobald also bei einem Response Meldungen enthalten sind, dann werden diese z.B. von AngularJs per Interceptor ausgewertet und im UI angezeigt. Das klappt auch sehr gut so lange man ein “aufgeblähtes” Model zurückgeben möchte. Wenn ich aber nur Daten für ein Typeahead benötige, was nur eine List<string> zurückgeben soll, dann möchte ich hier nicht eine Extra Klasse anlegen die nur ein Property für die List<string> enthält, nur damit ich eine Fehlermeldung mit zurückgeben kann. Für diese Fälle habe ich jetzt den Custom Error Handler für mich entdeckt.

Der Custom Error Handler wird aufgerufen, sobald eine Exception auftritt die nicht abgefangen wird und bis zum Controller Aufruf durchgereicht wird. Hier wird die Exception dann abgefangen und man kann den Ajax Call entsprechend ändern der zurückgegeben werden soll und den Fehler zurückgeben z.B. in der von mir bevorzugten Struktur, damit der Interceptor den Fehler auch abfangen und anzeigen kann.

Code Custom Error Handler:

/// <summary>
/// Custom Error Handler der über der passenden Controller Funktion verwendet wird um unbehandelte Ausnahmen abzufangen.
/// </summary>
public class CustomErrorHandlerAttribute : HandleErrorAttribute
{
    public bool IsAjaxCall { get; set; }

    public override void OnException(ExceptionContext context)
    {
        if (IsAjaxCall)
        {
            context.ExceptionHandled = true;
            var jsonResult = new JsonResult();
            jsonResult.Data = new {Message = context.Exception.Message , MessageType = "Error"};
            jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            jsonResult.ExecuteResult(context);
        }
        else
        {
            // if not an ajax request, continue with logic implemented by MVC -&gt; html error page
            base.OnException(context);
        }
    }
}

Beispiel Controller Methode die einen Fehler verursacht:

[CustomErrorHandler(IsAjaxCall = true)]
public JsonResult AddJsEntryOnly(Person person)
{
    throw  new Exception("Beim Laden der Daten ist ein Fehler aufgetreten!");
    return Json(person, JsonRequestBehavior.AllowGet);
}

Wenn ich den Rückgabewert (Ajax Call)  jetzt im Browser in der Konsole ausgeben lasse steht da:

image

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s