Pergunta

Quando utilizar jQuery's ajax método para submeter dados de formulário, qual é a melhor maneira de lidar com erros?Este é um exemplo do que uma chamada pode parecer com:

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

A solicitação pode falhar por uma série de razões, tais como nome de usuário duplicados, duplicar endereço de e-mail etc., e a ashx é escrito para lançar uma exceção quando isso acontece.

O meu problema parece ser que, ao lançar uma exceção a ashx faz com que o statusText e errorThrown para ser não definido.

Eu posso chegar à XMLHttpRequest.responseText que contém o HTML que compõe o padrão .net página de erro.

Eu estou achando que o título da página na responseText e usando o título para que o erro foi lançada.Embora, eu tenho uma suspeita de que isso vai desmoronar quando eu ativar o tratamento de erro personalizado páginas.

Eu deveria estar jogando a erros no ashx, ou devo estar retornando um código de status como parte dos dados retornado pela chamada a userCreation.ashx, e , em seguida, usar essa informação para decidir que medidas tomar?
Como você lida com essas situações?

Foi útil?

Solução

Eu deveria estar jogando a erros no ashx, ou devo retornar um código de status como parte dos dados devolvido pela chamada userCreation.ashx, em seguida, usando isso para decidir que medidas tomar?Como você lidar com essas situações?

Pessoalmente, se possível, eu prefiro lidar com isso no lado do servidor e o trabalho de uma mensagem para o usuário não existe.Isso funciona muito bem em um cenário onde você quer exibir uma mensagem ao usuário dizendo-lhes o que aconteceu (mensagem de validação, essencialmente).

No entanto, se você deseja executar uma ação com base no que aconteceu no servidor, você pode querer usar um código de status e a escrever um pouco de javascript para executar várias ações com base no que o código de status.

Outras dicas

Para depuração, eu normalmente só criar um elemento (no caso abaixo: <div id="error"></div>) na página e escrever o XmlHttpRequest para ele:

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

Em seguida, você pode ver os tipos de erros que estão ocorrendo e capturá-los corretamente:

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

Em seu ashx, você pode lançar uma nova exceção (e.g "Usuário Inválido", etc.) e, em seguida, basta analisar que, do XMLHttpRequest.responseText?Para mim, quando eu recebo um erro o XMLHttpRequest.responseText não é o padrão Asp.Net página de erro, é um objeto JSON que contém o erro como este:

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

Editar:Isso pode ser porque a função que eu estou chamando é marcado com estes atributos:

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

Agora eu tenho um problema, para qual a resposta a aceitar.

Um pouco mais de reflexão sobre o problema leva-me à conclusão de que eu estava incorretamente gerar exceções.Duplicar nomes de usuário, endereços de e-mail, etc são esperados problemas durante o processo de inscrição e não são, portanto, exceções, mas simplesmente erros.No caso, eu provavelmente não deveria estar jogando exceções, mas retornar códigos de erro.

O que me leva a pensar que irobinson do a abordagem deve ser o único a tomar neste caso, especialmente desde que o formulário é somente uma pequena parte da INTERFACE do usuário a ser exibido.Eu já implementou esta solução e eu estou voltando xml que contém um status e uma mensagem opcional que está a ser exibido.Eu, em seguida, pode usar o jQuery para analisá-lo e tomar a ação apropriada:-

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

No entanto travis' a resposta é muito detalhado e seria perfeito durante a depuração ou se eu queria exibir uma mensagem de exceção para o usuário.Eu sou definitivamente não receber o JSON de volta, então ele é provavelmente para baixo um desses atributos que travis listados, como eu não tê-los no meu código.

(Eu estou indo para aceitar irobinson a resposta, mas vote positivamente travis resposta.Ele só se sente estranho ter de aceitar uma resposta que não tem a maioria dos votos.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top