2012-10-19 7 views
5

ich eine Methode in einem Controller, die wie folgt aussieht:werfen einen Fehler aus einer MVC-Httppost zu jQuery zurück

[HttpPost] 
public void UnfavoriteEvent(int id) 
{ 
    try 
    { 
     var rows = _connection.Execute("DELETE UserEvent WHERE UserID = (SELECT up.UserID FROM UserProfile up WHERE up.UserName = @UserName) AND EventID = @EventID", 
      new { EventID = id, UserName = User.Identity.Name }); 
     if (rows != 1) 
     { 
      Response.StatusCode = 500; 
      Response.Status = "There was an unknown error updating the database."; 
      //throw new HttpException(500, "There was an unknown error updating the database."); 
     } 
    } 
    catch (Exception ex) 
    { 
     Response.StatusCode = 500; 
     Response.Status = ex.Message; 
     //throw new HttpException(500, ex.Message); 
    } 
} 

Und wie Sie habe ich versucht, diesen Fehler ein paar verschiedene Möglichkeiten sehen werfen zurück. Im JavaScript ich den folgenden Block haben diese Methode aufzurufen:

var jqXHR; 
if (isFavorite) { 
    jqXHR = $.ajax({ 
     type: 'POST', 
     url: '/Account/UnfavoriteEvent', 
     data: { id: $("#EventID").val() } 
    }); 
} 
else { 
    jqXHR = $.ajax({ 
     type: 'POST', 
     url: '/Account/FavoriteEvent', 
     data: { id: $("#EventID").val() } 
    }); 
} 

jqXHR.error = function (data) { 
    $("#ajaxErrorMessage").val(data); 
    $("#ajaxError").toggle(2000); 
}; 

Nun, was ich tun möchte, ist die Fehlermeldung zu erhalten, die zurück zur jqXHR.error Funktion geworfen erfolgt so, dass ich es richtig verarbeiten kann.

Zur Zeit der Code, der unkommentiert ist löst eine Ausnahme zu sagen, dass der Text, den ich in Status Platzierung bin nicht erlaubt ist, und der kommentierten Code gibt tatsächlich die Standard-Fehlerseite als Antwort (nicht wirklich überraschend).

Also habe ich ein paar Fragen:

  1. Wie werfe ich das richtig Fehler?
  2. Was macht die Response.Status Eigenschaft?

Vielen Dank!

+0

Da Sie eine generische Ausnahme abfangen, würde ich die spezifische Nachricht nicht an den Client zurücksenden. Dies könnte zu vertraulichen Informationen über Ihre Anwendung führen. Wenn Sie benutzerdefinierte Domänenausnahmen abfangen, in denen Sie die Kontrolle über die Nachricht haben, können Sie sie an den Client senden, aber für die generische Ausnahme sollten Sie eine allgemeine Nachricht senden. – BZink

+0

@BZink, sehr guter Punkt. Vielen Dank. –

Antwort

3

Sie werden derte den Antwortstatus von der JavaScript-Seite zu bekommen, die folgenden Schritte ausführen:

$.ajax({ 
    type: 'POST', 
    url: '/Account/UnfavoriteEvent', 
    data: { id: $("#EventID").val() }, 
    success: function(data, textStatus, jqXHR) { 
     // jqXHR.status contains the Response.Status set on the server 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // jqXHR.status contains the Response.Status set on the server 
    }}); 

Wie Sie sehen können, können Sie die Funktion für error zum ajax Funktion ... in Sie passieren müssen Beispiel: Sie setzen die Funktion error von jqXHR ohne Wirkung.

Dokumentation auf Ajax-Ereignisse

jQuery docs sagen, dass die Fehlerzeichenfolge in der errorThrown Parameter kommen wird.

Sie Antwort nicht

Stattdessen benutzen Sie HttpStatusCodeResult zurückkehren sollte:

[HttpPost] 
public void UnfavoriteEvent(int id) 
{ 
    try 
    { 
     var rows = _connection.Execute("DELETE UserEvent WHERE UserID = (SELECT up.UserID FROM UserProfile up WHERE up.UserName = @UserName) AND EventID = @EventID", 
      new { EventID = id, UserName = User.Identity.Name }); 
     if (rows != 1) 
     { 
      return new HttpStatusCodeResult(500, "There was an unknown error updating the database."); 
     } 
    } 
    catch (Exception ex) 
    { 
     return new HttpStatusCodeResult(500, ex.Message); 
    } 
} 
+0

Das hat mich definitiv in die Fehler-Methode im JavaScript gebracht, also danke! Aber die Fehler-Zeichenfolge, die ich will, ist nicht im "Response.Status". Was mache ich falsch Server-Seite und wie bekomme ich diese einfache Nachricht an den Client? –

+0

Danke, genau das habe ich gebraucht! –

Verwandte Themen