2014-12-22 2 views
4

ASP.NET MVC 응용 프로그램을 개발 중입니다. 오류 처리를 위해이 tutorial을 따랐습니다. 그래서, FilterConfig.cs 코드 :ASP.NET MVC 오류 처리 영역

@model System.Web.Mvc.HandleErrorInfo 

@{ 
    ViewBag.Title = "Index"; 
} 

<h1 class="text-danger">Custom Error.</h1> 
<h2 class="text-danger">An error occurred while processing your request.</h2> 

<h2>Exception details</h2> 
<p> 
    Controller: @Model.ControllerName <br /> 
    Action: @Model.ActionName<br /> 
    Message: @Model.Exception.Message <br /> 
    StackTrace: <br /> 
</p> 
<pre>Exception: @Model.Exception.StackTrace</pre> 

: 나는 또한 뷰에서 오류를 표시/오류보기를 생성

public class ErrorController : Controller 
{ 
    // GET: Error 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new CustomHandleErrorAttribute()); 
} 

나는 컨트롤러 폴더에 ErrorController 추가 그런 다음 관리 영역을 생성하고 모든 관리 뷰를 관리 폴더로 이동했습니다. 관리 영역에는 레이아웃이 있으며 기본 레이아웃과 다릅니다.

관리자 영역에서 오류를 처리하기 위해 ~/Areas/Admin/ControllersErrorController.cs을 생성했으며 ~/Areas/Admin/Views/Error에 해당보기를 작성하여 관리자의 레이아웃에 오류가 있지만 관리자 페이지에 오류가 발생했습니다. 메인 레이아웃 (~/Views/Error)에 메시지를 표시합니다.

MVC의 각 영역에 대한 오류를 처리하는 방법은 무엇입니까?

CustomErrorHandlerAttribute.cs

public class CustomHandleErrorAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     //base.OnException(filterContext); 

     // Log the error using Elmah & NLog 
     if (filterContext.Exception is DbEntityValidationException) 
     { 
      DbEntityValidationException dbevex = filterContext.Exception as DbEntityValidationException; 

      var errorMessages = (from eve in dbevex.EntityValidationErrors 
           let entity = eve.Entry.Entity.GetType().Name 
           from ev in eve.ValidationErrors 
           select new 
           { 
            Entity = entity, 
            PropertyName = ev.PropertyName, 
            ErrorMessage = ev.ErrorMessage 
           }); 

      var fullErrorMessage = string.Join("; ", errorMessages.Select(e => string.Format("[Entity: {0}, Property: {1}] {2}", e.Entity, e.PropertyName, e.ErrorMessage))); 
      var exceptionMessage = string.Concat(dbevex.Message, " The validation errors are: ", fullErrorMessage); 
      LogUtility.logger.Error(exceptionMessage); 
      ErrorSignal.FromCurrentContext().Raise(new DbEntityValidationException(exceptionMessage, dbevex.EntityValidationErrors)); 
     } 
     else 
     { 
      LogUtility.logger.Error(filterContext.Exception.Message, filterContext.Exception); 
     } 

     if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled) 
     { 
      return; 
     } 
     if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500) 
     { 
      return; 
     } 
     if (!ExceptionType.IsInstanceOfType(filterContext.Exception)) 
     { 
      return; 
     } 

     // If the request is AJAX return JSON else view 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) //if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
     { 
      // Because it's exception raised after ajax invocation, return Json 
      filterContext.Result = new JsonResult 
      { 
       Data = new 
       { 
        error = true, 
        message = filterContext.Exception.Message 
       }, 
       JsonRequestBehavior = JsonRequestBehavior.AllowGet 
      }; 
     } 
     else 
     { 
      var controllerName = (string)filterContext.RouteData.Values["controller"]; 
      var actionName = (string)filterContext.RouteData.Values["action"]; 
      var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName); 

      filterContext.Result = new ViewResult() 
      { 
       ViewName = View, 
       MasterName = Master, 
       ViewData = new ViewDataDictionary<HandleErrorInfo>(model), 
       TempData = filterContext.Controller.TempData 
      }; 
     } 

     filterContext.ExceptionHandled = true; 
     filterContext.HttpContext.Response.Clear(); 
     filterContext.HttpContext.Response.StatusCode = 500; 
     filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
    } 
} 

RouteConfig.cs

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     // Visual Studio 2013 Browser Link caused 
     // "The controller for path '/9ac086a69364466a841e03e001f946fd/arterySignalR/ping' could not be found." 
#if DEBUG 
     routes.IgnoreRoute("{*browserlink}", new { browserlink = @".*/arterySignalR/ping" }); 
#endif 
     // with code above, we can still use Browser Link feature without getting error 

     routes.MapRoute(
      "AxCustomer", 
      "AxCustomer/{action}/{id}", 
      new { controller = "AX_CUSTTABLE", action = "Index", id = UrlParameter.Optional }, 
      namespaces: new[] { "SalesSupportSystem.Controllers" } 
     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      namespaces: new[] { "SalesSupportSystem.Controllers" } 
     ); 
    } 
} 
+0

당신은'HandleErrorAttribute.cs'와'CustomHandleErrorAttribute.cs'하시기 바랍니다에 대한 코드를 게시 할 수 있습니까? –

+0

@JoeMighty HandleErrorAttribute가 MVC – Willy

답변

0

이 검증되지 않은,하지만 당신은 filterContext.Result를 설정하기 전에 filterContext.RouteData.Values["area"] = "Admin";Admin 영역을 지정 시도? 이처럼

:

filterContext.RouteData.Values["area"] = "Admin"; 
filterContext.Result = new ViewResult() 
... 
+0

ok 의 기본값입니다. 시도해 보겠습니다. – Willy

+0

주 프로젝트의 레이아웃을 계속 사용합니다. – Willy

+0

이상 함. 'ViewName = View'에 디버그 포인트를 추가하면'View'에 어떤 값이 있습니까? 광산이 예상대로 작동하는 것 같습니다. –