Thomas Bandt

Über mich | Kontakt | Archiv

ASP.NET MVC - Fehlermeldungen für Ajax-Requests ausgeben

Analog zum Beispiel mit dem Login-Check sollte man auch bei allen anderen Fehlern, die bei Ajax-Aufrufen passieren, den Benutzer nicht im Regen stehen lassen. Im klassischen Fall eines GET- oder POST-Aufrufs erhält man ja schließlich auch eine Fehlermeldung (mal mehr und mal weniger schön und vielsagend), das sollte auch für Ajax-Aufrufe gelten, bei denen Fehler ansonsten "verschluckt" werden.

Wie auch beim klassischen serverseitigen Exceptionhandling sollte man sich nicht in Details verlieren und um jeden Aufruf einen try-/catch-Block bauen oder manuell Error-Handler für Aufrufe einhängen, sondern wenn möglich die Fehler an einer sehr hoch gehängten Stelle zentral abfangen und verarbeiten.

Das lässt sich auf der Serverseite mit ASP.NET MVC z.B. durch die Verwendung eines Basis-Controllers und die Nutzung seines OnException-Events nutzen:

   1:  public class BaseController : Controller
   2:  {
   3:      protected override void OnException(ExceptionContext filterContext)
   4:      {
   5:          // Fehlermeldung für Ajax-Requests ausgeben
   6:          if(filterContext.HttpContext.Request.IsAjaxRequest())
   7:          {
   8:              filterContext.RequestContext.HttpContext.Response.Write(filterContext.Exception.Message);
   9:              filterContext.RequestContext.HttpContext.Response.ContentType = MediaTypeNames.Text.Plain;
  10:              filterContext.RequestContext.HttpContext.Response.StatusCode = 500;
  11:              filterContext.ExceptionHandled = true;    
  12:          }
  13:          base.OnException(filterContext);
  14:      }
  15:  }

Was passiert hier? Zunächst einmal hängen wir uns hier nur rein, wenn es sich um einen Ajax-Request handelt, alle anderen Fehler werden wie gewohnt behandelt (oder auch nicht). Die Ausgabe schreiben wir um, und zwar geben wir die Exception-Message als reinen Text aus. Der Status-Code wird auf 500 gesetzt - nur so bekommt jQuery später mit, dass ein Fehler aufgetreten ist. Lässt man den Part weg, gibt es einen Code 200 und der Request wird auf der Client-Seite ganz normal abgearbeitet. Alternativ kann man diesen Part auch in einen eigenen Filter legen, wenn man die Verarbeitung z.B. nicht für alle oder auch nur einen ganzen einzelnen Controller sondern nur für eine Action haben möchte.

Im nächsten Schritt muss der Client nun nur noch etwas davon mitbekommen:

   1:  $().ready(function () {
   2:      $('#AppStatusBar').ajaxError(function (xhr, status, err) {
   3:          alert("Fehler: " + status.responseText);
   4:      });
   5:  });

Der Error-Handler muss wie bereits im Login-Post gesagt an irgendein DOM-Objekt gehängt werden, was möglichst auf jeder Seite vorhanden ist. Ruft man dann eine Action z.B. per $.post() auf und schmeißt diese irgendeine Exception, dann gibt's die Exception-Message als Alert vor die Nase des Benutzers.



« Zurück  |  Weiter »