2010-02-05 13 views
21

Ahora mis publicaciones ajax disparan sus eventos de Error incluso si la acción no causó un error. Tengo una acción ASP.NET MVC que se parece a:¿Qué devolver desde la acción MVC de ASP.NET para permitir que el evento de éxito jQuery ajax se active?

[AcceptVerbs(HttpVerbs.Post)] 
public virtual ActionResult StuffToDo(int id) 
{ 
    // do various things that work ... 
    return new JsonResult(); // i have to return something, so this... 
} 

En el lado del cliente tengo este jQuery:

$('#actionClick').click(function() { 
    if (confirm('Are you sure?')) { 
     $.ajax({ 
      type: "POST", 
      url: "/Customer/StuffToDo/<%= Model.Customer.Id %>", 
      contentType: "application/json; charset=utf-8", 
      data: "{}", 
      dataType: "json", 
      success: function() { 
       ShowSuccessResult("Yay!"); 
      }, 
      error: function(xhr, ajaxOptions, thrownError) { 
       ShowErrorResult("Boo! Message:" + xhr.responseText); 
      } 
     }); 
     } 
     return false; 
}); 

Si la acción se realiza correctamente (no hay excepciones lanzadas), entonces yo esperaría que el controlador de eventos de éxito que se activará. En cambio, el evento de error se está disparando. ¿Hay algo que debería pasar o cambiar en la acción para que el evento de éxito se dispare?

Me doy cuenta de que esta pregunta es básicamente la misma que this other question, pero mi controlador de errores ya tiene la firma expandida que resolvió la pregunta de la otra persona.

Edición Por la petición, aquí está la respuesta que estoy recibiendo:

Link to the screen shot (no estoy seguro cómo demostrarlo en cuestión)

Edición he cambiado el devuelve valor a Null para ver si eso afectó algo, pero no cambió el comportamiento.

Edición Su empezando a parecerse a esto es un problema con HTTPS. Recibo respuestas múltiples de la solicitud. Los dos primeros son 401 mensajes y luego obtengo un 200.

+0

Qué hay en la respuesta HTTP? – Pointy

+0

¿puede publicar una captura de pantalla de la respuesta de solicitud de Firebug desde la consola – Cherian

+0

y cuál es el xhr.responseText? –

Respuesta

36

Creo que el problema es que no devuelve nada en el JsonResult. Pruebe:

return this.Json(string.Empty); 

y vea si eso funciona. Creo que el problema es que usted está volviendo nada a la llamada jQuery en lugar de un conjunto de JSON vacío:

{} 
+0

JsonResult no acepta argumentos. Cambié el retorno a un valor nulo, pero eso no afectó el resultado. –

+0

@Sailing Judo - Rompí ese y solucioné el ejemplo del código. El controlador expone un método Json() que acepta un objeto y devuelve un objeto JsonResult. – 48klocs

+0

¡este era el problema! Nunca hubiera esperado esto en un millón de años. buena solucion –

17

Volviendo un resultado vacío también puede ser útil

return new EmptyResult(); 

Nota: El tipo de retorno no necesita ser ActionResult ni evento que herede de él. De hecho, mvc te permitirá llamar a cualquier método público. Sin embargo, siempre debe usar el tipo de devolución más explícito que desee, como cualquier otro método (como JsonResult).

-3

El tipo de devolución en su método debe ser JsonResult en lugar de ActionResult.

+8

A JsonResult es un ActionResult. – msfanboy

8

2 notas rápidas para cualquiera de aterrizar aquí luchando para disparar el Ajax jQuery success devolución de llamada desde un controlador MVC:

  1. Si está utilizando type: "GET" en su Ajax, que necesitará para incluir JsonRequestBehavior.AllowGet para evitar el default contra JSON Hijacking security measures

return Json(true, JsonRequestBehavior.AllowGet); 
  1. Según lo indicado anteriormente, si ha indicado dataType: 'json' en la solicitud de Ajax, si está realizando una llamada de una vía (p. Save) donde no necesita nada, puede devolver cualquier cosa serializable como Json desde el controlador. Pero con un 200, algo debe ser devuelto. Use un 204 si no se devuelve ningún dato.

incorrecto - Lanza el Ajax error manipulador!

// Nope - Status 200 must have some content 
return new HttpStatusCodeResult(HttpStatusCode.OK); 

// Also returns a 200 with no data - not allowed 
return new EmptyResult(); 

Obras - desencadena el controlador de éxito Ajax:

// Return a 204 if there's no data 
return new HttpStatusCodeResult(HttpStatusCode.NoContent); 

// Return something with a 200 return 
return Json(new {Success = true}); 
+1

Este fue mi problema. Estaba haciendo un GET y me olvidé de AllowGet, por lo que el retorno arrojaba una excepción y mi javascript lo manejaba como un error. – chrismay

Cuestiones relacionadas