2009-01-02 26 views
31

Esto está relacionado con mi pregunta en how to handle errors from jQuery AJAX calls. Varias respuestas sugirieron que use la devolución de llamada de "error" para mostrar los errores de una llamada jQuery AJAX. Me preguntaba cómo hacer eso usando ASP.NET MVC. ¿Hay alguna manera para que mi acción de controlador devuelva un error que sería accesible desde la devolución de llamada de "error"? El código del lado del cliente podría ser algo como esto:¿Cómo desencadena la devolución de llamada de "error" en una llamada jQuery AJAX utilizando ASP.NET MVC?

$.ajax({ 
    type: "POST", 
    url: "MyUrl", 
    data: "val1=test", 
    success: function(result){ 
     // Do stuff 
    }, 
    error: function(request,status,errorThrown) { 

    } 
}); 

Respuesta

21

NOTA: Oye, esto se publicó antes de que ASP.Net MVC incluso llegue a 1.0, y ni siquiera he mirado el marco desde entonces. Probablemente deberías dejar de votar esto arriba.


hacer algo como esto:

código
Response.StatusCode = (int)HttpStatusCode.BadRequest; 
actionResult = this.Content("Error message here"); 

El estado debe cambiar en función de la naturaleza del error; generalmente, 4xx para problemas generados por el usuario y 5xx para problemas del lado del servidor.

+1

¿Lo has probado en IE8? La propiedad request.responseText contiene null, no existe la cadena 'Mensaje de error aquí' :( – stej

+0

También tiene problemas para obtener el "Mensaje de error aquí" en FF ... – rball

1

Creo que ese evento se eleva por cualquier respuesta que tiene un código de respuesta que no sea 200. No puedo encontrar una prueba de ello en la documentación sin embargo.

Para hacer esto desde code (trabaja en formularios web):

throw new HttpException(500, "Error message"); 
+0

¿Cómo se envía un código de respuesta distinto de 200 de una acción del controlador? Digamos que mi acción de controlador determina que el usuario no tiene derecho a acceder a la función y deseo devolver un código de respuesta distinto de 200 para que se active la devolución de llamada de "error". ¿Cómo haría esto? –

+0

Hmm, ¿arrojaría una excepción de la acción del controlador? Eso debería enviar un código de respuesta de 500 ¿verdad? –

+0

Editado la respuesta para proporcionar una posible forma de hacerlo –

1

Según this página, sólo tiene que aplicar la cabecera HTTP/1.0 500 Internal Server Error en su página ASP.net. La solicitud $.ajax detectará ese error y ejecutará la función de devolución de llamada error. =]

8

Si está utilizando

[HandleError] 

luego tirar un HttpException va a quedar atrapados y encaminado a su página de error personalizada.

Otra opción es utilizar

Response.StatusCode = 500; 
Response.Write("Error Message"); 
Response.End(); 

Hay probablemente una manera más conveniente de escribir esto, pero no han tropezado con ella todavía.

+0

Sí, el atributo [HandleError] era lo que me estaba atrapando. Capturaba mis excepciones y redireccionaba a mi página de error. Desafortunadamente este atributo estaba en la clase del controlador, así que no lo vi de inmediato. –

+0

Creo que marcó una respuesta incorrecta. Preferiría la respuesta de ALassek sobre la HttpException que es técnicamente incorrecta –

+0

Técnicamente incorrecto si está usando HandleError, técnicamente –

7

Si está utilizando MVC 3, entonces se puede devolver un ActionResult en su controlador que tiene el código de estado HTTP y el mensaje de estado juntos:

return new HttpStatusCodeResult(500, "Error message"); 

Luego, en su respuesta de error:

error: function (request, textStatus, errorThrown) { 
    alert(request.statusText); 
} 
+0

Me pregunto qué es el código detrás de HttpStatusCodeResult nuevo (500, "Mensaje de error ");.. ¿Es la fuente en algún lugar o tal vez podemos reflector? Probablemente sea útil para aquellos de nosotros en 2. – rball

+0

@rball - El código está en codeplex en el siguiente enlace: http://aspnet.codeplex.com/releases/view/50092 – amurra

+0

Eso me lleva a la fuente completa. No estoy seguro de si hice clic en la cosa incorrecta, pero incluso al buscar casualmente la fuente no encontré nada. Tendré que descargar y ver si puedo encontrarlo a través del IDE. – rball

1

Le envío una propuesta; trabaja con excepciones constreñidas e incontroladas.

public class CodeExceptionToHttpFilter : FilterAttribute, IExceptionFilter 
{ 
    public CodeExceptionToHttpFilter() 
    { 
     Order = 2; 
    } 
    public void OnException(ExceptionContext filterContext) 
    { 
     var codeException = filterContext.Exception as CodeException; 
     var response = filterContext.RequestContext.HttpContext.Response; 
    response.StatusCode = (codeException == null)? 550: 551; 
     response.ContentType = MediaTypeNames.Text.Plain; 
     response.Charset = "utf-8"; 
     response.Write(filter.Exception.Message); 
     filterContext.ExceptionHandled = true; 
     response.TrySkipIisCustomErrors = true; 
    } 

}

Más información en mi blog. http://rodrigopb.wordpress.com/2012/11/28/gestion-de-errores-en-peticiones-ajax-a-mvc/

Cuestiones relacionadas