Frage

Beim Benutzen jQuery'S Ajax-Methode Wie gehe ich beim Übermitteln von Formulardaten am besten mit Fehlern um?Dies ist ein Beispiel dafür, wie ein Anruf aussehen könnte:

$.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();
        }
});

Die Anfrage kann aus verschiedenen Gründen fehlschlagen, z. B. aufgrund eines doppelten Benutzernamens, einer doppelten E-Mail-Adresse usw., und der Ashx ist so geschrieben, dass er in diesem Fall eine Ausnahme auslöst.

Mein Problem scheint zu sein, dass der Ashx durch das Auslösen einer Ausnahme das verursacht statusText Und errorThrown zu sein nicht definiert.

Ich komme zum XMLHttpRequest.responseText die den HTML-Code enthält, aus dem die standardmäßige .net-Fehlerseite besteht.

Ich finde den Seitentitel im Antworttext und verwende den Titel, um herauszufinden, welcher Fehler ausgegeben wurde.Obwohl ich den Verdacht habe, dass dies zusammenbricht, wenn ich benutzerdefinierte Fehlerbehandlungsseiten aktiviere.

Sollte ich die Fehler im Ashx ausgeben oder sollte ich einen Statuscode als Teil der vom Aufruf zurückgegebenen Daten zurückgeben? userCreation.ashx, und anhand dessen dann zu entscheiden, welche Maßnahmen ergriffen werden sollen?
Wie gehen Sie mit diesen Situationen um?

War es hilfreich?

Lösung

Sollte ich die Fehler in der ASHX werfen, oder sollte ich einen Statuscode als Teil der Daten zurückgeben, die durch den Anruf bei usercreation.ashx zurückgegeben werden, und verwenden Sie diese dann, um zu entscheiden, welche Maßnahmen erforderlich sind?Wie gehen Sie mit diesen Situationen um?

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

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

Andere Tipps

Zum Debuggen erstelle ich normalerweise einfach ein Element (im folgenden Fall: <div id="error"></div>) auf der Seite und schreiben Sie den XmlHttpRequest hinein:

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

Dann können Sie die auftretenden Fehlerarten erkennen und richtig erfassen:

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

Können Sie in Ihrem Ashx eine neue Ausnahme auslösen (z. B. „Ungültiger Benutzer“ usw.) und diese dann einfach aus dem Ashx analysieren? XMLHttpRequest.responseText?Für mich, wenn ich eine Fehlermeldung bekomme XMLHttpRequest.responseText ist nicht die standardmäßige Asp.Net-Fehlerseite, sondern ein JSON-Objekt, das 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"
}

Bearbeiten:Dies könnte daran liegen, dass die Funktion, die ich aufrufe, mit diesen Attributen gekennzeichnet ist:

<WebMethod()> _
<ScriptMethod()> _

Jetzt habe ich ein Problem, welche Antwort ich akzeptieren soll.

Wenn ich weiter über das Problem nachdenke, komme ich zu dem Schluss, dass ich fälschlicherweise Ausnahmen ausgelöst habe.Doppelte Benutzernamen, E-Mail-Adressen usw. sind bei einem Anmeldevorgang zu erwartende Probleme und stellen daher keine Ausnahmen, sondern lediglich Fehler dar.In diesem Fall sollte ich wahrscheinlich keine Ausnahmen auslösen, sondern Fehlercodes zurückgeben.

Was mich dazu bringt, das zu denken Irobinsons In diesem Fall sollte der richtige Ansatz gewählt werden, insbesondere da das Formular nur einen kleinen Teil der angezeigten Benutzeroberfläche ausmacht.Ich habe diese Lösung nun implementiert und gebe eine XML-Datei zurück, die einen Status und eine optionale Meldung enthält, die angezeigt werden soll.Ich kann es dann mit jQuery analysieren und die entsprechenden Maßnahmen 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' Die Antwort ist sehr detailliert und wäre perfekt während des Debuggens oder wenn ich dem Benutzer eine Ausnahmemeldung anzeigen möchte.Ich erhalte JSON definitiv nicht zurück, daher liegt es wahrscheinlich an einem dieser Attribute, die Travis aufgelistet hat, da ich sie nicht in meinem Code habe.

(Ich werde Irobinsons Antwort akzeptieren, aber Travis' Antwort positiv bewerten.Es fühlt sich einfach seltsam an, eine Antwort zu akzeptieren, die nicht die meisten Stimmen hat.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top