2016-09-08 7 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, вы должны отправить ответ json с свойством, которое указывает, к какому URL перенаправляется. Если это не запрос 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"}}); 
    } 
} 

Теперь вы можете слушать .ajaxError() событие, которое будет срабатывать в любое время Ajax запрос завершается ошибкой. Получите значение 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

Смежные вопросы