2009-04-10 13 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では役に立たないものです。

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

これは素晴らしい作品が、実際にスローされる例外がないので、明らかにキャッチ()文では、例外処理からのすべてのフィルタを防ぐ:私は私のAppControllerBaseでJSONアクションのため、このメソッドを実装しました。フィルタ(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に保存し、フィルタで傍受することができます。

関連する問題