2009-04-10 10 views
5

używam filtru do wyjątków zgłaszanych przez działania, który wygląda jak ten log:ASP.Net MVC - jak obsługiwać wyjątek w akcji JSON (zwracać informacje o błędzie JSON), ale także publikować wyjątek dla filtrów?

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

Teraz chciałbym obsługiwać wszystkie moje działania JSON powrócić wynik JSON z informacjami wyjątków. Pozwala to na wywołania Ajax w celu ustalenia, czy na serwerze wystąpił błąd, zamiast odbierać źródło strony błędu, które jest bezużyteczne dla Ajax. I zostały wdrożone tej metody dla działań JSON w moim 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}); 
     } 
    } 

Działa to miłe, ale oczywiście catch() oświadczenie zapobiega wszystkie filtry z obsługi wyjątku, ponieważ nie ma wyjątków rzucony faktycznie. Czy jest jakiś sposób, aby pozostawić wyjątek dostępny dla filtrów (filterContext.Exception)?

Odpowiedz

-1

Rozwiązanie:

działanie

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

filtr

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

opublikuj swoją JsonFailure && JsonSuccess – ari

1

Można zapisać wyjątek w RequestContext i przechwycić go w filtrze.