2012-03-31 6 views
0

사용자 지정 예외를 작성했으며 내 응용 프로그램이 '예외 상태'라고 생각할 때마다이 클래스의 인스턴스를 던지고 있습니다. 이 예외는 응용 프로그램 논리 클래스 (내 경우에는 서비스)에서 발생합니다. 이제는 기본 ASP MVC 예외 리디렉션을 사용하고 있지만 이러한 사용자 지정 예외의 경우 '오류'페이지로 리디렉션하지 않고 div에 메시지를 표시하고 싶습니다 (예 : 내 Layout.cshtml 페이지). TempData [ "ApplicationError"]에 예외 메시지를 추가하려고 생각했습니다. 이 코드를 한 번만 쓰고 싶습니다. 내 컨트롤러 동작 방법 전체가 아닙니다. 그래서, 내 기본 컨트롤러 클래스에서 나는 보호 무효 OnException (ExceptionContext filterContext)을 무시하고 내 코드는 다음과 같습니다ASP MVC에 표시되는 사용자 지정 예외 메시지

protected override void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception is InvalidOperationException) 
      TempData["ApplicationError"] = filterContext.Exception.Message; 
     else 
      base.OnException(filterContext); 
    } 

내 문제는이 예외가 발생했을 때 여전히 기본 오류 페이지로 리디렉션이다 . 나는 이것을 원하지 않는다. 내가 원하는 것은 사용자가있는 동일한 뷰에서 친숙한 div에 사용자 정의 예외 메시지를 표시하는 것입니다. 이걸 어떻게 달성 할 수 있을지에 대한 아이디어가 있습니까?

답변

0

비슷한 상황에서 내가 한 일은 오류 메시지와 성공 메시지에 대한 ViewModel (다른 모든 뷰 모델이 상속되는 기본 클래스에 추가 됨)에 속성을 추가 한 것입니다. 오류 (응용 프로그램/시스템)가있을 때마다이 속성에 값을 설정하고 내보기에이를 표시합니다. 나는 항상 컨트롤러에서 viewmodel을 반환 할 것이므로 에러 페이지가 표시되지 않도록 할 것이다.

public class BaseViewModel 
{ 
    public string ErrorMessage { set;get;} 
    public string SuccessMessage {set;get;} 
    public bool IsValid { set;get;} 
} 

public class UserViewModel: BaseViewModel 
{ 
    // user properties 
} 

그리고 내 컨트롤러에서

public ActionResult Get(int id) 
{ 

    UserViewModel ovjUser; 
    try 
    { 
    objUser=MyService.GetUser(id); 
    if(!objUser.IsValid) 
    { 
     objUser.ErrorMessage="This User Account is not Valid"; 
    } 
    } 
    catch(Exception ex) 
    { 
    // log error 
    objUser.ErrorMessage="Application is buzy now!.Pls try later"; 
    } 
    return View(objUser); 
} 
+0

감사합니다. 이 접근법의 문제점은이 예외를 던지는 모든 메소드에서 try-cacth-AddError를 복사/붙여 넣기해야한다는 것입니다. 나는 이것을 원하지 않는다. 나는 이것을 항상 다루기위한 중앙 (인프라) 장소와 같은 것이 필요합니다. 대부분의 경우 뷰 관련 데이터를 백업하는 뷰 모델조차 가지고 있지 않습니다. –

+0

강력하게 형식화 된보기를 제공하므로 ViewModel을 사용하는 것이 좋습니다. – Shyju

+0

지금 VM을 필요로하지 않습니다. 특히 내 문제를 해결할 때 그렇습니다. –

0

시도는 ExceptionHandled 속성을 설정하여 예외를 처리 한 것을 나타내는 :

protected override void OnException(ExceptionContext filterContext) 
{ 
    if (filterContext.Exception is InvalidOperationException) 
    { 
     filterContext.ExceptionHandled = true; 
     var viewResult = new ViewResult(); 
     viewResult.ViewData["ApplicationError"] = filterContext.Exception.Message; 
     filterContext.Result = viewResult; 
    } 
} 

중요한 측면이를 그 예외는 내부가 이후 컨트롤러 액션은 액션 결과가 리턴 된 지점까지 도달하지 못했습니다. 따라서 액션이 뷰를 렌더링하고, JSON을 반환하고, 리디렉션해야하는지 여부를 더 이상 알 수 없습니다. 따라서 filterContext.Result 속성을 설정하여보기를 렌더링한다고 가정 할 수 있습니다. 분명히이 뷰와 연관된 뷰 모델이 있다면이를 재구성 할 수 없습니다. 그래서 당신의 뷰가 내부에 뭔가있는 경우,보기 모드로 아무 것도하지 않으려 고하는 방식으로 구성되어 있는지 확인하십시오. => 실행 중간에 응용 프로그램이 다운 된 것을 기억하십시오. 행동.

+0

고마워, 예외 처리 범위에서 중단 점을 설정, 거기에 도착하지만 여전히 예외와 함께 죽음의 노란색 화면이 나타납니다 ... 내가 로컬로 (localhost/...)? –

관련 문제