2009-04-10 7 views
5

J'utilise un filtre pour connecter les exceptions lancées par des actions qui ressemble à ceci:ASP.Net MVC - comment gérer l'exception dans l'action JSON (retourner l'information d'erreur JSON), mais aussi publier l'exception pour les filtres?

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.Exception != null) 
     { 
      //logger.Error(xxx); 
     } 
     base.OnActionExecuted(filterContext); 
    } 

Maintenant, j'aimerais traiter toutes mes actions JSON pour revenir résultat JSON avec des informations d'exception. Cela permet aux appels Ajax de déterminer s'il y a eu une erreur sur le serveur au lieu de recevoir la source de la page d'erreur, ce qui est inutile pour Ajax. Je l'ai mis en œuvre cette méthode pour les actions JSON dans mon AppControllerBase:

public ActionResult JsonExceptionHandler(Func<object> action) 
    { 
     try 
     { 
      var res = action(); 
      return res == null ? JsonSuccess() : JsonSuccess(res); 
     } 
     catch(Exception exc) 
     { 
      return JsonFailure(new {errorMessage = exc.Message}); 
     } 
    } 

Cela fonctionne bien, mais de toute évidence la déclaration des captures() empêche tous les filtres de gérer l'exception, parce qu'il n'y a pas d'exception levée en fait. Est-il possible de laisser l'exception disponible pour les filtres (filterContext.Exception)?

Répondre

-1

La solution:

l'action

public ActionResult JsonExceptionHandler(Func<object> action) 
    { 
      try 
      { 
        var res = action(); 
        return res == null ? JsonSuccess() : JsonSuccess(res); 
      } 
      catch(Exception exc) 
      { 
        controller.ControllerContext.HttpContext.AddError(exc); 
        return JsonFailure(new {errorMessage = exc.Message}); 
      } 
    } 

filtre

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
      var exception = filterContext.Exception ?? filterContext.HttpContext.Error; 
      if (exception != null) 
      { 
       //logger.Error(xxx); 
      } 

      if (filterContext.Result != null && 
       filterContext.HttpContext.Error != null) 
      { 
       filterContext.HttpContext.ClearError(); 
      } 

      base.OnActionExecuted(filterContext); 
    } 
+6

s'il vous plaît publier votre JsonFailure && JsonSuccess – ari

1

Vous pouvez stocker l'exception dans le RequestContext et l'intercepter dans votre filtre.

Questions connexes