2010-03-04 33 views
15

Estoy usando ASP.NET MVC para desarrollar un sitio web. Estoy usando jquery para la funcionalidad AJAX. En los métodos de acción, deseo devolver algún error para indicar que la entrada no es correcta o que la acción no se pudo realizar. En tales casos de error, espero que se llame al manejador de errores jquery ajax y pueda tomar las medidas apropiadas allí. No he encontrado una manera de cómo hacer esto. A continuación está mi método de acción.Cómo devolver el error de la acción MVC de ASP.NET

En casos de error, ¿qué debería estar enviando desde una Acción para que se active el controlador de errores jquery?

public ActionResult AddToFavourites(int entityId, string entityType) 
    { 

     if (!Request.IsAjaxRequest()) 
      throw new InvalidOperationException("This action can be called only in async style."); 

     try 
     { 
      RBParams.EntityType typeOfFavourite = (RBParams.EntityType)Enum.Parse(typeof(RBParams.EntityType), entityType); 
      string status = ""; 

      if (typeOfFavourite == RBParams.EntityType.BusinessEntity) 
      { 
       status = MarkFavouriteEntity(entityId); 
      } 
      else if (typeOfFavourite == RBParams.EntityType.Review) 
      { 
       status = MarkFavouriteReview(entityId); 
      } 
      else 
      { 
       throw new InvalidOperationException("The type of the entity is not proper"); 
      } 

      return Content(status); 

     } 
     catch (Exception ex) 
     { 

      return Content("Error"); 
     } 
    } 

Respuesta

22

Su manejador de error de Ajax se llamará cuando la acción no devuelve un código de estado esperado. Por ejemplo, se activará si no se encontró la acción o si se lanza una excepción que no se maneja. En su caso, se invocará si no detecta el error en su acción (ya que la acción arrojará un código de estado de 500).

Sin embargo, no lo haría de esta forma, ya que probablemente sea un error esperado. Preferiría devolver json tanto cuando tienes éxito como cuando tienes un error. Luego puede indicar si se trata de una llamada exitosa o no. Algo como esto:

public ActionResult AddToFavourites(int entityId, string entityType) 
{ 

    if (!Request.IsAjaxRequest()) 
     throw new InvalidOperationException("This action can be called only in async style."); 

    try 
    { 
     RBParams.EntityType typeOfFavourite = (RBParams.EntityType)Enum.Parse(typeof(RBParams.EntityType), entityType); 
     string status = ""; 

     if (typeOfFavourite == RBParams.EntityType.BusinessEntity) 
     { 
      status = MarkFavouriteEntity(entityId); 
     } 
     else if (typeOfFavourite == RBParams.EntityType.Review) 
     { 
      status = MarkFavouriteReview(entityId); 
     } 
     else 
     { 
      throw new InvalidOperationException("The type of the entity is not proper"); 
     } 

     return Json(new { Success = true, Status = status }); 

    } 
    catch (Exception ex) 
    { 

     return Json(new { Success = false, Message = ex.Message }); 
    } 
} 

Luego lo maneja de la misma manera que una llamada exitosa. Solo verifica la propiedad Success de tu respuesta json. Luego maneja errores inesperados en la devolución de llamada de error.

+0

Explicado muy claramente. Muchas gracias, Mattias Jakobsson. – mohang

+0

¿Las configuraciones 'Json' proporcionadas en su ejemplo se establecerán en las variables' xhr' del cliente? – Shimmy

+3

No he votado negativamente, pero no estoy de acuerdo. (Lo siento, @Mattias). Esto hará que se active la devolución de llamada de "éxito" de JavaScript. Siempre queremos que la devolución de llamada de error se active cuando hay un error en el servidor. Esto viola la semántica. De forma simétrica, nos gustaría devolver un error de la serie 500. – Rap

0

que deberían poner config jQuery para manejar el error:

$.ajaxSetup({ 
    error: function(xhr) { 
     alert(xhr.statusText); 
    } 
}) 
+2

Ild615, había hecho esto en $ .ajaxSetup (...). Mi problema es qué debería estar enviando desde Action para activar este controlador de errores. – mohang

9

La respuesta de Mattias Jakobsson es correcta. Pero creo que la mejor manera de devolver el error a jQuery es crear un JSON y enviarlo con el estado 500. Sin embargo, cuando lo hice e intenté implementar mi sitio web de MVC usando IIS 7, me di cuenta de que me estaba devolviendo el código personalizado. página en lugar del mensaje.

El código era ...

catch (Exception ex) 
{ 
    Response.StatusCode = 500; 
    return Json(new { error = ex.Message }); 
} 

Pero luego vi this thread que me llevó a este web site (de Rick Strahl).

En general, entendí que lo que necesita decir a IIS que se inyecte la página personalizada de error, por lo que necesita este indicador (en el Global.asax o en la captura):

Response.TrySkipIisCustomErrors = true;

Por lo tanto, en jQuery el código mantiene lo mismo:

$.ajax({...}) 
.done(function (result) {...}) 
.fail(function (e) { 
    console.log(e.responseJSON.error); 
}); 
+1

Esta es una respuesta excelente y completa. Muestra un ejemplo del controlador ** y ** la llamada AJAX correspondiente. Gracias por tomarse el tiempo. – Doppelganger

Cuestiones relacionadas