2009-04-10 4 views
5

Я использую фильтр для входа исключения, с помощью действий, выглядит следующим образом:ASP.Net MVC - как обрабатывать исключение в действии JSON (возвращать информацию об ошибке JSON), но также публиковать исключение для фильтров?

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

Теперь я хотел бы, чтобы обрабатывать все свои действия в формате JSON для возвращения JSON результата с информацией исключения. Это позволяет вызовам Ajax определять, была ли какая-либо ошибка на сервере вместо получения источника страницы ошибки, что бесполезно для Ajax. Я реализовал этот метод действий JSON в моем 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}); 
     } 
    } 

Это работает хорошо, но, очевидно, улов() заявление предотвращает все фильтры от обработки исключений, потому что нет никакого исключения выброшено на самом деле. Есть ли способ оставить исключение доступным для фильтров (filterContext.Exception)?

ответ

-1

Решение:

действие

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

фильтр

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

пожалуйста опубликуйте JsonFailure && JsonSuccess – ari

1

Вы можете сохранить исключение в RequestContext и перехватить его в своем фильтре.