2010-03-04 30 views
15

Ich verwende ASP.NET MVC für die Entwicklung einer Website. Ich benutze jquery für AJAX-Funktionalität. In den Aktionsmethoden möchte ich einen Fehler zurückgeben, um zu signalisieren, dass die Eingabe nicht korrekt ist oder dass die Aktion nicht durchgeführt werden konnte. In solchen Fehlerfällen erwarte ich, dass der JQuery-Ajax-Fehlerhandler aufgerufen wird und ich dort geeignete Maßnahmen ergreifen kann. Ich habe keinen Weg gefunden, dies zu tun. Folgendes ist meine Aktionsmethode.Wie Fehler von ASP.NET MVC-Aktion zurückgegeben werden

In Fehlerfällen, was soll ich von einer Aktion senden, um den jquery error handler auszulösen?

public ActionResult AddToFavourites(int entityId, string entityType) 
    { 

     if (!Request.IsAjaxRequest()) 
      throw new InvalidOperationException("This action can be called only in async style."); 

     try 
     { 
      RBParams.EntityType typeOfFavourite = (RBParams.EntityType)Enum.Parse(typeof(RBParams.EntityType), entityType); 
      string status = ""; 

      if (typeOfFavourite == RBParams.EntityType.BusinessEntity) 
      { 
       status = MarkFavouriteEntity(entityId); 
      } 
      else if (typeOfFavourite == RBParams.EntityType.Review) 
      { 
       status = MarkFavouriteReview(entityId); 
      } 
      else 
      { 
       throw new InvalidOperationException("The type of the entity is not proper"); 
      } 

      return Content(status); 

     } 
     catch (Exception ex) 
     { 

      return Content("Error"); 
     } 
    } 

Antwort

22

Ihre AJAX-Fehler-Handler wird aufgerufen, wenn die Aktion gibt keinen erwarteten Statuscode. Es wird beispielsweise ausgelöst, wenn die Aktion nicht gefunden wurde oder wenn Sie eine Ausnahme auslösen, die Sie nicht behandeln. In Ihrem Fall wird es aufgerufen, wenn Sie den Fehler in Ihrer Aktion nicht abfangen (da die Aktion einen 500-Statuscode zurückgibt).

Ich würde es jedoch nicht auf diese Weise tun, da dies wahrscheinlich ein erwarteter Fehler ist. Ich würde lieber json zurückgeben, wenn Sie erfolgreich sind und wenn Sie einen Fehler haben. Dann können Sie angeben, ob es sich um einen erfolgreichen Anruf handelt oder nicht. So etwas wie das:

public ActionResult AddToFavourites(int entityId, string entityType) 
{ 

    if (!Request.IsAjaxRequest()) 
     throw new InvalidOperationException("This action can be called only in async style."); 

    try 
    { 
     RBParams.EntityType typeOfFavourite = (RBParams.EntityType)Enum.Parse(typeof(RBParams.EntityType), entityType); 
     string status = ""; 

     if (typeOfFavourite == RBParams.EntityType.BusinessEntity) 
     { 
      status = MarkFavouriteEntity(entityId); 
     } 
     else if (typeOfFavourite == RBParams.EntityType.Review) 
     { 
      status = MarkFavouriteReview(entityId); 
     } 
     else 
     { 
      throw new InvalidOperationException("The type of the entity is not proper"); 
     } 

     return Json(new { Success = true, Status = status }); 

    } 
    catch (Exception ex) 
    { 

     return Json(new { Success = false, Message = ex.Message }); 
    } 
} 

Dann behandeln Sie es auf die gleiche Weise wie ein erfolgreicher Anruf. Sie überprüfen nur die Success-Eigenschaft Ihrer JSON-Antwort. Dann behandeln Sie unerwartete Fehler im Fehlerrückruf.

+0

Sehr klar erklärt. Vielen Dank, Mattias Jakobsson. – mohang

+0

Sind die 'Json' Einstellungen in Ihrem Beispiel auf' xhr' Variablen des Clients eingestellt? – Shimmy

+3

Ich habe nicht downvote, aber ich stimme nicht zu. (Entschuldigung, @ Mattias). Dadurch wird der JavaScript- "Erfolg" -Rückruf ausgelöst. Wir möchten immer, dass der Fehlerrückruf ausgelöst wird, wenn ein Fehler auf dem Server auftritt. Dies verletzt die Symantik. Symmetrisch möchten wir einen Fehler der 500-Serie zurückgeben. – Rap

0

Sie shoud Config jquery Fehler behandeln:

$.ajaxSetup({ 
    error: function(xhr) { 
     alert(xhr.statusText); 
    } 
}) 
+2

Ild615 hatte ich dies in der $ .ajaxSetup (...) getan. Mein Problem ist, was ich von Aktion senden soll, um diese Fehlerbehandlung auszulösen. – mohang

9

Mattias Jakobssons Antwort ist richtig. Aber ich denke, der beste Weg, den Fehler an die jQuery zurückzugeben, ist ein JSON zu erstellen und es mit dem Status 500 zu senden. Als ich es jedoch tat und versuchte, meine MVC-Website mit IIS 7 zu implementieren, fand ich heraus, dass es mir die Gewohnheit zurückgab Seite anstelle der Nachricht.

Der Code war ...

catch (Exception ex) 
{ 
    Response.StatusCode = 500; 
    return Json(new { error = ex.Message }); 
} 

Aber dann sah ich this thread, die mich (von Rick Strahl) zu dieser web site geführt.

Insgesamt habe ich verstanden, dass Sie die benutzerdefinierte Fehlerseite nicht zu injizieren IIS sagen müssen, so müssen Sie dieses Flag (in der global.asax oder in den Fang):

Response.TrySkipIisCustomErrors = true;

Also, jQuery der Code behält das gleiche:

$.ajax({...}) 
.done(function (result) {...}) 
.fail(function (e) { 
    console.log(e.responseJSON.error); 
}); 
+1

Dies ist eine ausgezeichnete und vollständige Antwort. Sie zeigen ein Beispiel des Controllers ** und ** den entsprechenden AJAX-Aufruf. Danke, dass du dir die Zeit genommen hast. – Doppelganger

Verwandte Themen