por peticiones peticion parametros net mvc llenar enviar desde con asp asp.net jquery ajax

asp.net - peticiones - ¿Cómo manejaría los errores al usar jQuery.ajax()?



peticion ajax mvc (3)

¿Debo arrojar los errores en el ashx, o debería devolver un código de estado como parte de los datos devueltos por la llamada a userCreation.ashx, y luego usar esto para decidir qué acción tomar? ¿Cómo manejas estas situaciones?

Personalmente, si es posible, preferiría manejar esto en el lado del servidor y elaborar un mensaje para el usuario allí. Esto funciona muy bien en un escenario donde solo desea mostrar un mensaje al usuario diciéndole lo que sucedió (mensaje de validación, esencialmente).

Sin embargo, si desea realizar una acción basada en lo que sucedió en el servidor, es posible que desee utilizar un código de estado y escribir algunos javascript para realizar diversas acciones basadas en ese código de estado.

Al utilizar el método ajax de jQuery para enviar datos del formulario, ¿cuál es la mejor forma de manejar los errores? Este es un ejemplo de cómo se vería una llamada:

$.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 solicitud puede fallar por varias razones, como el nombre de usuario duplicado, la dirección de correo electrónico duplicada, etc., y el ashx está escrito para emitir una excepción cuando esto sucede.

Mi problema parece ser que al lanzar una excepción, el ashx hace que el errorThrown y errorThrown no estén definidos .

Puedo acceder al XMLHttpRequest.responseText que contiene el HTML que compone la página de error .net estándar.

Estoy buscando el título de la página en el texto de respuesta y usando el título para determinar qué error se produjo. Aunque tengo la sospecha de que esto se derrumbará cuando habilite páginas personalizadas para el manejo de errores.

¿Debo arrojar los errores en el ashx, o debería devolver un código de estado como parte de los datos devueltos por la llamada a userCreation.ashx , y luego usar esto para decidir qué acción tomar?
¿Cómo manejas estas situaciones?


Ahora tengo un problema con respecto a qué respuesta aceptar.

Pensar más en el problema me lleva a la conclusión de que estaba lanzando excepciones incorrectamente. Los nombres de usuario duplicados, direcciones de correo electrónico, etc. son problemas esperados durante un proceso de registro y, por lo tanto, no son excepciones, sino simplemente errores. En cuyo caso, probablemente no debería lanzar excepciones, sino devolver códigos de error.

Lo que me lleva a pensar que el enfoque de irobinson debería ser el indicado en este caso, especialmente dado que la forma es solo una pequeña parte de la IU que se muestra. Ahora he implementado esta solución y estoy devolviendo xml que contiene un estado y un mensaje opcional que se mostrará. Entonces puedo usar jQuery para analizarlo y tomar la acción adecuada:

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

Sin embargo, la respuesta de travis es muy detallada y sería perfecta durante la depuración o si quería mostrar un mensaje de excepción al usuario. Definitivamente no estoy recibiendo JSON, por lo que probablemente se deba a uno de esos atributos que travis ha enumerado, ya que no los tengo en mi código.

(Voy a aceptar la respuesta de irobinson, pero voto la respuesta de travis. Me parece extraño aceptar una respuesta que no tiene la mayoría de los votos).


Para la depuración, normalmente solo creo un elemento (en el caso a continuación: <div id="error"></div> ) en la página y escribo la solicitud XmlHttpRequest:

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

Luego puede ver los tipos de errores que están ocurriendo y capturarlos correctamente:

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

En su ashx, ¿puede lanzar una nueva excepción (por ejemplo, "Usuario Inválido", etc.) y luego analizar eso fuera del XMLHttpRequest.responseText ? Para mí, cuando recibo un error, XMLHttpRequest.responseText no es la página de error Asp.Net estándar, es un objeto JSON que contiene el error de esta manera:

{ "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: Esto podría deberse a que la función que estoy llamando está marcada con estos atributos:

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