2010-03-04 4 views
15

J'utilise ASP.NET MVC pour développer un site Web. J'utilise jquery pour la fonctionnalité AJAX. Dans les méthodes d'action, je veux retourner une erreur pour signaler que l'entrée n'est pas correcte ou que l'action n'a pas pu être effectuée. Dans de tels cas d'erreur, je m'attends à ce que le gestionnaire d'erreur jquery ajax soit appelé et que je puisse prendre les mesures appropriées. Je n'ai pas trouvé un moyen de le faire. Voici ma méthode d'action. En cas d'erreur, que dois-je envoyer d'une Action pour déclencher le gestionnaire d'erreur jquery?Comment retourner une erreur à partir de l'action ASP.NET MVC

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

Répondre

22

Votre gestionnaire d'erreur ajax sera appelée lorsque l'action ne retourne pas un code d'état attendu. Il se déclenchera, par exemple, si l'action n'a pas été trouvée ou si vous lancez une exception que vous ne gérez pas. Dans votre cas, il sera appelé si vous n'attrapez pas l'erreur dans votre action (car l'action retournera un code d'état de 500).

Cependant, je ne le ferais pas de cette manière car il s'agit probablement d'une erreur attendue. Je préférerais renvoyer json à la fois quand vous réussissez et quand vous avez une erreur. Ensuite, vous pouvez indiquer si l'appel est réussi ou non. Quelque chose comme ceci:

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

Ensuite, vous le gérer comme un appel réussi. Vous venez de vérifier la propriété Success de votre réponse json. Ensuite, vous gérez les erreurs inattendues dans le rappel d'erreur.

+0

Très clairement expliqué. Merci beaucoup, Mattias Jakobsson. – mohang

+0

Les paramètres 'Json' fournis dans votre exemple seront-ils définis sur les variables' xhr' du client? – Shimmy

+3

Je n'ai pas downvote, mais je ne suis pas d'accord. (Désolé, @Mattias). Cela provoquera le rappel JavaScript "succès". Nous voulons toujours que le rappel d'erreur se déclenche lorsqu'il y a une erreur sur le serveur. Cela viole les symantics. Symétriquement, nous voudrions retourner une erreur de la série 500. – Rap

0

vous shoud config jquery pour gérer l'erreur:

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

Ild615, j'avais fait cela dans le $ .ajaxSetup (...). Mon problème est de savoir ce que je devrais envoyer à partir d'Action pour déclencher ce gestionnaire d'erreurs. – mohang

9

La réponse de Mattias Jakobsson est juste. Mais je pense que la meilleure façon de retourner l'erreur à jQuery est de créer un JSON et de l'envoyer avec le statut 500. Cependant, quand je l'ai fait et essayé de déployer mon site web MVC en utilisant IIS 7, j'ai compris qu'il me renvoyait page au lieu du message.

Le code était ...

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

Mais j'ai vu this thread qui m'a conduit à cette web site (de Rick Strahl).

Dans l'ensemble, je compris que vous devez dire à IIS pour ne pas injecter la page d'erreur personnalisée, vous devez donc ce drapeau (dans le global.asax ou dans la prise):

Response.TrySkipIisCustomErrors = true;

Ainsi, jQuery le code conserve le même:

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

Ceci est une excellente réponse complète. Vous montrez un exemple du contrôleur ** et ** l'appel AJAX correspondant. Merci de prendre le temps. – Doppelganger

Questions connexes