2016-09-08 9 views
1

私はかなりの間この問題を回避するために苦労していますが、私にとってはうまくいく解決策を見つけることができません。エラーページは常に部分的に読み込まれます

OnExceptionメソッドを、他のすべてのコントローラが継承するBaseControllerクラスでオーバーライドすることによって、すべてのエラーを処理します。

protected override void OnException(ExceptionContext filterContext) 
     { 
      filterContext.ExceptionHandled = true; 
      var rd = new RouteData 
      { 
       Values = { ["controller"] = "Error", ["action"] = "Index" }, 
       DataTokens = { } 
      }; 
      var error = [email protected]"Error: {filterContext.Exception.Message} in {filterContext.HttpContext.Request.FilePath} 
          Details: 
          {filterContext.Exception.StackTrace}"; 

      _logger = LogManager.GetLogger(GetType()); 
      _logger.Error(error + Environment.NewLine + "Temp Id: " + AppSession.TempId); 

      IController c = new ErrorController(); 
      c.Execute(new RequestContext(new HttpContextWrapper(System.Web.HttpContext.Current), rd)); 
     } 

マイエラーコントローラは非常に単純です:

public ActionResult Index() 
     { 
      ViewBag.Error = "Oops.. Something went wrong"; 
      return View("Error"); 
     } 

それは動作しますが、エラーページが現れるが、それは常に部分ビューコンテナ、エラーが発生した部分図の内側にアップロードします。代わりに、ちょうどエラーページだけに適切なリダイレクトをしたい。

私はこのようにエラーを使用して処理しようとしましたが、まったく同じように動作します。私はまた、私は何も違いはないと知っていたGlobal.asax Application_Errorメソッドでエラーを処理しようとしましたが、私は とにかく試してみたかった..

私の推測は、$ .get部分的なビューがロードされていたのと同じdiv /コンテナに応答をラップします。

ご協力いただければ幸いです。より多くの情報が必要な場合は、私に知らせてください。

は私も... SO同様のシナリオが、ノーポストのために、私が見つけたことを、良い解決策を持っている上、事前に

感謝を探してみました。

答えて

1

あなたがしなければならないことは、ajax呼び出しでエラーが発生した場合、どのURLにリダイレクトするかを示すプロパティを持つjson応答を送信する必要があります。それがajaxリクエストでない場合は、通常のredirectresultを送信できます。この

protected override void OnException(ExceptionContext filterContext) 
{ 
    //your existing code to log errors here 

    filterContext.ExceptionHandled = true; 
    if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
    { 
     var targetUrl = UrlHelper.GenerateUrl("Default", "Index", "Error", 
       new RouteValueDictionary(), RouteTable.Routes, Request.RequestContext, false); 

     filterContext.Result = new JsonResult 
     { 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
      Data = new { Error = true, Message = filterContext.Exception.Message, 
                    RedirectUrl= targetUrl } 
     }; 
     filterContext.HttpContext.Response.StatusCode = 500; 

     filterContext.ExceptionHandled = true; 
    } 
    else 
    { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary 
              {{"controller", "Error"}, {"action", "Index"}}); 
    } 
} 

よう

何かが今、あなたはいつでも解雇AJAX要求がエラーで終了します.ajaxError()イベントを聴くことができます。 RedirectUrl値を取得し、必要に応じてリダイレクトします。 は、ユーザー(モーダルダイアログの部分的な表示でさえ)に意味のあるメッセージを表示することを検討して、ユーザーがブラインドリダイレクトで混乱しないようにすることもできます。

$(function() { 

     $(document).ajaxError(function (event, request, settings) {   
      console.log('ajax request', request.responseText); 
      var d = JSON.parse(request.responseText); 
      alert("Ajax error:"+d.Message); 
      window.location.href = d.RedirectUrl; 
     }); 
}); 
+1

ahh $(document).ajaxError!それは決して考えなかった。私は応答としてjsonを送信することを考えていましたが、すべてのAjax関数のエラー処理を一般化する方法は不明でした。私はこれがうまくいくかもしれないと思う。ありがとう、私はそれを行くだろう! – Johny

+0

もう一度ありがとう!これは魅力的に機能しました。答えとしてマーク:) – Johny

関連する問題