2009-04-10 14 views
5

Sto utilizzando un filtro per accedere eccezioni generate da azioni che assomiglia a questo:ASP.Net MVC: come gestire l'eccezione nell'azione JSON (restituisce informazioni sull'errore JSON), ma pubblica anche l'eccezione per i filtri?

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

Ora mi piacerebbe gestire tutte le mie azioni JSON per tornare risultato JSON con informazioni sulle eccezioni. Ciò consente alle chiamate Ajax di determinare se ci fosse qualche errore sul server invece di ricevere l'origine della pagina di errore, che è inutile per Ajax. Ho implementato questo metodo per le azioni JSON nel mio 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}); 
     } 
    } 

Questo funziona bello, ma ovviamente l'istruzione catch() impedisca tutti i filtri dalla gestione l'eccezione, perché non c'è eccezione generata in realtà. C'è un modo per lasciare l'eccezione disponibile per i filtri (filterContext.Exception)?

risposta

-1

La soluzione:

azione

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

filtro

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

si prega di pubblicare il tuo JsonFailure && JsonSuccess – ari

1

È possibile memorizzare l'eccezione nel RequestContext e intercettarla nel filtro.