2009-07-17 4 views
1

ASP.NET MVC 앱에서 컨트롤러의 OnException을 무시하여 오류를 처리하고 있습니다. 페이지에서 런타임 오류가 발생하면 Error.aspx 페이지가 안에 오류가 발생한 페이지 인 을 엽니 다. 다음은 코드입니다 (일부 오류 메시지가 삭제 된 경우) :예외 처리가 현재 페이지 내부에서 오류 페이지를 엽니 다.

Protected Overrides Sub OnException(ByVal filterContext As System.Web.Mvc.ExceptionContext) 
    MyBase.OnException(filterContext) 

    filterContext.ExceptionHandled = True 
    View("Error").ExecuteResult(ControllerContext) 

End Sub 

Error.aspx 페이지가 Shared 디렉토리에 있습니다. 예를 들어 내보기의 형식이 작성자이고 내 모델의 책 테이블이 떨어져 있고 책에 대한 읽기 권한이없는 경우 참조하려고 시도 할 때

<%=Model.Books.Count> 

전체 Error.aspx 페이지가 카운트가 예정된 지점에 나타납니다. 어떻게 이것을 오류 페이지로 리디렉션하고 문제 페이지를 뒤에 남겨 두게합니까?

는 업데이트 : 바로보기의 상단에

<% Throw New Exception("b0rkd")%> 

을 넣어

더 쉬운 예입니다. Error.aspx는 원본 페이지 내에 예외를 넣는 지점에서 완전히 렌더링됩니다.

답변

2

결과가 이미 렌더링되고 이후 작동하지 결과 대체 결과를 처리하는 동안 예외가 발생하는 경우

편집. 이 경우 기존 결과를 지우고 오류 결과를 명시 적으로 렌더링 해 볼 수 있습니다.

원래

protected override void OnException(ExceptionContext filterContext) 
{ 
    filterContext.ExceptionHandled = true; 
    filterContext.HttpContext.Response.ClearContent(); 
    ViewResult view = new ViewResult { ViewName = "Error" }; 
    view.ExecuteResult(filterContext.Controller.ControllerContext); 
} 

대신 응답 오류보기를 렌더링하여 오류보기로 filterContext에 결과를 설정합니다.

filterContext.ExceptionHandled = true; 
filterContext.Result = View("Error"); 
+0

의미가 있지만, 아직 변경되지 않은 것 같습니다. 원본 페이지 내부는 여전히 렌더링됩니다. – gfrizzle

+0

지금 문제가 있습니다. 결과가 실행될 때 예외가 발생합니다. 그 시점에서, 그것을 대체하기에는 너무 늦었습니다. 이것은 액션 실행 중에 예외가 발생하면 작동합니다. 내 대답을 업데이트 할게. – tvanfosson

+0

빙고! 편집 해 주셔서 감사합니다. 질문 할 올바른 질문을 모른 채 조사하는 것이 쉬운 주제는 아니 었습니다. – gfrizzle

관련 문제