Domanda

Quando si usa jQuery'S metodo ajax per inviare i dati del modulo, qual è il modo migliore per gestire gli errori?Questo è un esempio di come potrebbe apparire una chiamata:

$.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 richiesta potrebbe non riuscire per una serie di motivi, ad esempio nome utente duplicato, indirizzo e-mail duplicato, ecc. e ashx viene scritto per generare un'eccezione quando ciò accade.

Il mio problema sembra essere che lanciando un'eccezione ashx causa il file statusText E errorThrown essere non definito.

Posso arrivare al XMLHttpRequest.responseText che contiene l'HTML che costituisce la pagina di errore .net standard.

Trovo il titolo della pagina in ResponseText e utilizzo il titolo per capire quale errore è stato generato.Anche se ho il sospetto che questo andrà in pezzi quando abilito le pagine di gestione degli errori personalizzate.

Dovrei lanciare gli errori in ashx o dovrei restituire un codice di stato come parte dei dati restituiti dalla chiamata a userCreation.ashx, quindi usarlo per decidere quale azione intraprendere?
Come gestisci queste situazioni?

È stato utile?

Soluzione

Dovrei lanciare gli errori nell'ASHX o dovrei restituire un codice di stato come parte dei dati restituiti dalla chiamata a UserCreation.ashx, quindi usando questo per decidere quale azione intraprendere?Come gestisci queste situazioni?

Personalmente, se possibile, preferirei gestire la cosa sul lato server e inviare lì un messaggio all'utente.Funziona molto bene in uno scenario in cui desideri solo visualizzare un messaggio all'utente che gli spieghi cosa è successo (messaggio di convalida, essenzialmente).

Tuttavia, se desideri eseguire un'azione in base a ciò che è accaduto sul server, potresti voler utilizzare un codice di stato e scrivere alcuni javascript per eseguire varie azioni basate su quel codice di stato.

Altri suggerimenti

Per il debug, di solito creo semplicemente un elemento (nel caso seguente: <div id="error"></div>) sulla pagina e scrivici il codice XmlHttpRequest:

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

Quindi puoi vedere i tipi di errori che si stanno verificando e catturarli correttamente:

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

Nel tuo ashx, puoi lanciare una nuova eccezione (ad esempio "Utente non valido" ecc.) e poi semplicemente analizzarla dal XMLHttpRequest.responseText?Per me quando ricevo un errore il XMLHttpRequest.responseText non è la pagina di errore standard di Asp.Net, è un oggetto JSON contenente l'errore in questo modo:

{
"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"
}

Modificare:Ciò potrebbe essere dovuto al fatto che la funzione che sto chiamando è contrassegnata con questi attributi:

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

Ora ho un problema su quale risposta accettare.

Un'ulteriore riflessione sul problema mi porta alla conclusione che stavo lanciando eccezioni in modo errato.Nomi utente, indirizzi e-mail ecc. duplicati sono problemi previsti durante il processo di registrazione e pertanto non costituiscono eccezioni, ma semplicemente errori.In tal caso probabilmente non dovrei lanciare eccezioni, ma restituire codici di errore.

Il che mi porta a pensarlo di Ironbinson dovrebbe essere quello da adottare in questo caso, soprattutto perché il modulo rappresenta solo una piccola parte dell'interfaccia utente visualizzata.Ora ho implementato questa soluzione e sto restituendo un xml contenente uno stato e un messaggio facoltativo da visualizzare.Posso quindi utilizzare jQuery per analizzarlo e intraprendere l'azione appropriata:-

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

Tuttavia Travis la risposta è molto dettagliata e sarebbe perfetta durante il debug o se volessi visualizzare un messaggio di eccezione all'utente.Sicuramente non riceverò indietro JSON, quindi probabilmente è dovuto a uno di quegli attributi elencati da Travis, poiché non li ho nel mio codice.

(Accetterò la risposta di Irobinson, ma voterò a favore la risposta di Travis.È strano accettare una risposta che non ha il maggior numero di voti.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top