2008-08-26 7 views
31

Bei der Verwendung von jQueryajax method zum Übermitteln von Formulardaten, was ist der beste Weg, um Fehler zu behandeln? Diese ist ein Beispiel dafür, was ein Anruf aussehen könnte:Wie würden Sie Fehler bei der Verwendung von jQuery.ajax() behandeln?

$.ajax({ 
    url: "userCreation.ashx", 
    data: { u:userName, p:password, e:email }, 
    type: "POST", 
    beforeSend: function(){disableSubmitButton();}, 
    complete: function(){enableSubmitButton();}, 
    error: function(xhr, statusText, errorThrown){ 
      // Work out what the error was and display the appropriate message 
     }, 
    success: function(data){ 
      displayUserCreatedMessage(); 
      refreshUserList(); 
     } 
}); 

Der Antrag kann für eine Reihe von Gründen fehlschlagen, wie doppelte Benutzernamen, doppelte E-Mail-Adresse usw. und die Ashx geschrieben wird, eine Ausnahme zu werfen wenn das passiert.

Mein Problem scheint durch Auslösen einer Ausnahme der Ashx bewirkt, dass die statusText und errorThrown sein undefined zu sein, dass.

Ich kann an die XMLHttpRequest.responseText, die die HTML enthält, die die Standard-.net-Fehlerseite bildet.

Ich finde den Seitentitel im responseText und benutze den Titel, um herauszufinden, welcher Fehler ausgelöst wurde. Ich habe zwar den Verdacht, dass dies bei der Aktivierung von benutzerdefinierten Seiten zur Fehlerbehandlung auseinander fallen wird.

Sollte ich die Fehler in der Aschx werfen, oder sollte ich einen Statuscode als Teil der Daten zurückgeben, die durch den Anruf an userCreation.ashx zurückgegeben werden, dann mit dieser entscheiden, welche Maßnahme zu ergreifen?
Wie gehen Sie mit diesen Situationen um?

Antwort

16

Soll ich die Fehler in den Ashx werfen, oder soll ich von dem Aufruf von userCreation.ashx einen Statuscode als Teil der Daten zurückgegeben werden zurückkehren, indem diese dann entscheiden, welche Maßnahmen nehmen? Wie gehen Sie in diesen Situationen mit um?

Persönlich, wenn möglich, würde ich es vorziehen, dies auf der Serverseite zu behandeln und eine Nachricht an den Benutzer dort aufarbeiten. Dies funktioniert sehr gut in einem Szenario, in dem Sie nur eine Nachricht an den Benutzer anzeigen möchten, die ihm sagt, was passiert ist (im Wesentlichen eine Validierungsnachricht).

Wenn Sie jedoch eine Aktion basierend auf dem ausführen möchten, was auf dem Server passiert ist, möchten Sie möglicherweise einen Statuscode verwenden und etwas Javascript schreiben, um verschiedene Aktionen basierend auf diesem Statuscode auszuführen.

20

Zum Debuggen, ich in der Regel nur ein Element erstellen (in dem Fall unter: <div id="error"></div>) auf der Seite und schreiben Sie die XmlHttpRequest es:

error: function (XMLHttpRequest, textStatus, errorThrown) { 
    $("#error").html(XMLHttpRequest.status + "\n<hr />" + XMLHttpRequest.responseText); 
} 

Dann können Sie die Arten von Fehlern sehen, die auftreten und erfassen sie richtig:

if (XMLHttpRequest.status === 404) // display some page not found error 
if (XMLHttpRequest.status === 500) // display some server error 

In Ihrem Ashx Sie eine neue Ausnahme auslösen können (zB „Invalid User“ etc.) und dann analysieren nur, dass aus dem XMLHttpRequest.responseText? Für mich, wenn ich einen Fehler bekomme, ist die XMLHttpRequest.responseText nicht die Standard-Asp.Net-Fehlerseite, es ist ein JSON-Objekt den Fehler wie folgt enthält:

{ 
"Message":"Index was out of range. Must be non-negative and less than the size of the collection.\r\n 
Parameter name: index", 
"StackTrace":" at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)\r\n 
at etc...", 
"ExceptionType":"System.ArgumentOutOfRangeException" 
} 

Edit: Das könnte sein, weil die Funktion Ich rufe mit diesen Attributen gekennzeichnet ist:

<WebMethod()> _ 
<ScriptMethod()> _ 
+0

+1: Vielen Dank. –

+0

@Ismail Ich denke, Sie sollten dies in einer neuen Frage stellen und etwas von Ihrem Code zur Verfügung stellen. – travis

4

Jetzt habe ich eine Problem, welche Antwort zu akzeptieren.

Weitere Überlegungen zu dem Problem bringen mich zu dem Schluss, dass ich fälschlicherweise Ausnahmen geworfen habe. Doppelte Benutzernamen, E-Mail-Adressen usw. sind zu erwartende Probleme während eines Anmeldeprozesses und sind daher keine Ausnahmen, sondern einfach Fehler. In diesem Fall sollte ich wahrscheinlich keine Ausnahmen werfen, sondern Fehlercodes zurückgeben.

Das führt mich zu der Annahme, dass irobinson's Ansatz in diesem Fall sein sollte, vor allem da das Formular nur ein kleiner Teil der Benutzeroberfläche angezeigt wird. Ich habe jetzt diese Lösung implementiert und ich gebe XML zurück, das einen Status und eine optionale Nachricht enthält, die angezeigt werden soll. Ich kann dann jQuery verwenden, um sie zu analysieren und die entsprechenden Maßnahmen zu ergreifen: -

success: function(data){ 
    var created = $("result", data).attr("success"); 
    if (created == "OK"){ 
     resetNewUserForm(); 
     listUsers(''); 
    } else { 
     var errorMessage = $("result", data).attr("message"); 
     $("#newUserErrorMessage").text(errorMessage).show(); 
    } 
    enableNewUserForm(); 
} 

jedoch travis' Antwort ist sehr detailliert und wäre perfekt während der Fehlersuche oder wenn ich wollte eine Ausnahmemeldung an den Benutzer angezeigt werden soll. Ich werde JSON definitiv nicht zurück erhalten, also liegt es wahrscheinlich an einem dieser Attribute, die travis aufgelistet hat, da ich sie nicht in meinem Code habe.

(Ich werde irobinson Antwort, aber upvote travis' Antwort akzeptieren Es fühlt sich einfach seltsam, eine Antwort zu akzeptieren, die nicht die meisten Stimmen hat..)

Verwandte Themen