Question

Lors de l'utilisation de jQuery's ajax méthode pour envoyer des données de formulaire, ce qui est la meilleure façon de gérer les erreurs?Ceci est un exemple de ce qu'est un appel qui pourrait ressembler à:

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

La requête peut échouer pour diverses raisons, telles que les doublons de nom d'utilisateur, dupliquer, adresse email, etc, et la ashx est écrit pour lever une exception lorsque cela se produit.

Mon problème semble être que par la levée d'une exception à la ashx causes de la statusText et errorThrown pour être undefined.

Je peux aller à la XMLHttpRequest.responseText qui contient le code HTML qui fait la norme .net page d'erreur.

Je viens de trouver le titre de la page dans le responseText et en utilisant le titre quelle erreur a été levée.Bien que je soupçonne que cela va tomber en morceaux quand je activer les messages d'erreur de manipulation pages.

Dois-je jeter les erreurs dans le ashx, ou devrais-je retourner un code d'état en tant que partie des données retournées par l'appel à userCreation.ashx, puis à l'aide de cette information pour décider des mesures à prendre?
Comment gérez-vous ces situations?

Était-ce utile?

La solution

Dois-je jeter les erreurs dans le ashx, ou devrais-je retourner une code d'état en tant que partie des données retourné par l'appel à userCreation.ashx, puis à l'aide de ce décider de l'action à prendre?Comment faites-vous face à ces situations?

Personnellement, si possible, je préfère gérer ce côté serveur et le travail d'un message à l'utilisateur.Cela fonctionne très bien dans un scénario où vous ne voulez afficher un message à l'utilisateur de leur dire ce qui s'est passé (message de validation, pour l'essentiel).

Cependant, si vous souhaitez effectuer une action fondée sur ce qui s'est passé sur le serveur, vous pouvez utiliser un code d'état, et écrire un peu de javascript pour effectuer diverses actions basé sur ce code d'état.

Autres conseils

Pour le débogage, j'ai l'habitude de simplement créer un élément (dans le cas ci-dessous: <div id="error"></div>) sur la page et d'écrire le XmlHttpRequest pour elle:

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

Ensuite, vous pouvez voir les types d'erreurs qui se produisent et de les capturer correctement:

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

Dans votre ashx, pouvez-vous jeter un new exception (e.g "Utilisateur non Valide", etc.) et puis juste parse que de la XMLHttpRequest.responseText?Pour moi, quand je reçois une erreur la XMLHttpRequest.responseText n'est-ce pas la norme Asp.Net page d'erreur, c'est un objet JSON contenant l'erreur comme ceci:

{
"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:Ce pourrait être parce que la fonction que je vais appeler est marqué avec ces attributs:

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

Maintenant, j'ai un problème pour répondre à accepter.

La poursuite de la réflexion sur le problème qui m'amène à la conclusion que j'ai été incorrectement lever des exceptions.Dupliquer les noms d'utilisateur, adresses e-mail, etc sont attendus questions lors d'un processus d'enregistrement et ne sont donc pas des exceptions, mais simplement des erreurs.Dans ce cas, je ne devrais pas être de lever des exceptions, mais le retour des codes d'erreur.

Ce qui m'amène à penser que irobinson de l' l'approche doit être le seul à prendre dans ce cas, surtout depuis que la forme n'est qu'une petite partie de l'INTERFACE utilisateur affichée.J'ai maintenant mis en œuvre cette solution, et je suis de retour xml contenant un statut et une option de message à afficher.Je peux alors utiliser jQuery pour l'analyser et prendre les mesures appropriées:-

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

Cependant travis la réponse est très détaillé et ce serait parfait pendant le débogage ou si je voulais afficher un message d'exception à l'utilisateur.Je ne suis certainement pas la réception de JSON en arrière, donc c'est probablement à un seul de ces attributs que travis a répertorié, comme je ne les ai pas dans mon code.

(Je vais accepter irobinson réponse, mais upvote travis réponse.Il se sent juste étrange d'accepter une réponse qui n'a pas recueilli le plus de voix.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top